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).
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: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.