Timers evaluate things when they are started rather than when the time is up.
When someone parts or quits, the event happens "before" the number of people in the channel changes. So you were getting the number of people in the channel just before the person left. The timer with no delay can be used to make it happen after the person leaves. Even with 0 delay, it still happens afterwards. However, because timers evaluate when they are called, it would still tell you the number of people at the time of the event rather than the number of people at the time the event finishes (i.e. the person leaves). The ! after the $ makes the timer *not* evaluate the identifier until the time the timer triggers.
Try these as examples to see:
//.timer 3 1 echo -a $time
//.timer 3 1 echo -a $!time
As you can see, the first one just repeats the $time that it was when the timer was started and the second one tells you the $time it is when the timer triggers.