when you call your alias manually, you're doing it from within the #channel window where $chan is defined either for a command typed in the editbox or launched from the nicklist or channel rightclick menus. mIRC has never defined $chan for a timer launched from :TEXT: or other similar events.

Note how the

* Timer 1 activated
* Timer 1 halted

created during your event are echoed by mIRC to the status window instead of the channel. To avoid the activated/halt message showing, use .timer instead of timer

If you want this alias to work from within the :TEXT: event, you need to pass the channel name to the alias on its command line

Code:
on *:TEXT:!test:#:{ 
timer1 1 3 zonahod $unsafe( $chan )
}

alias zonahod { var %a $chan | if ($1 ischan) var %a $1 | if (%a) msg %a message goes here }