timer 1 1 set -s %new.var $eval(%test.var,0) gives me the desired result
Here you are preventing evaluation
when you start the timer, which indeed works, but keep in mind that whatever you pass in then still has to be valid at the time that the timer triggers. For example, if you unset %test.var before the timer triggers, you will end up with nothing. That may or may not be what you want; often, it is not. When passing in something like a local variable or
$1-, preventing evaluation when starting the timer will not work: when the timer actually triggers, the context in which that variable or identifier was valid will be gone.
Alternatively, you can prevent evaluation
when the timer triggers. Usually that is a better approach, and also easier: mIRC has a built-in identifier for that, namely
$unsafe. For example:
//set -s %test.var $eval($file(mirc.exe).version,0) | timer 1 1 set -s %new.var $unsafe(%test.var)