It's always been like this, and it's very useful. It allows you to evaluate identifiers when the command is performed instead of when the timer is started.

Here is a simple workaround, it isn't perfect mind you (has trouble with identifiers inside identifiers).
Code:
on 1:OPEN:?:*:{
  var %text 
  .echo -q $regsub($1-,/\$(?=\S)/g,\$!,%text)
  .timer 1 1 checkmsg $nick %text
}

You could also use $replace($1-,$,$+($,!)), but that also has problems.

Edit:
Code:
on 1:OPEN:?:*:{ 
  var %i = 1
  while ( $eval($+(%,onopen.,%i),2) != $null ) {
    inc %i
  }
  set $+(%,onopen.,%i) $1-
  .timer 1 1 checkmsg $nick $+(%,onopen.,%i) $chr(124) unset $+(%,onopen.,%i)
}

That way seems to work perfectly provided the alias doesn't /halt.