This is due to the strange way $* evaluates. I'd hesitate to call it a bug, since the evaluation routine is obviously deliberate.
What is happening is that in each of your test cases, the $* is being evaluated last - AFTER the $+. So going through the order of evaluation:
The $+() evaluates to:
The m00h is ignored in the same way it would be with an identifier like $+, the $* evaluates to either a, b or c, and is subsequently echoed.
As I'm sure you're aware, the two possible work-arounds are as follows (using your examples):
//tokenize 32 a b c | scon -r echo * $* $!+ m00h
//tokenize 32 a b c | scon -r echo * $!+( $* ,m00h)
The /scon re-evaluates the whole line, so that in each case the $* is evaluated BEFORE the $+() or $+.
The second problem, `~$* is also due to the way the $* is handled by the engine. For some reason, mIRC does an internal replacement of $* to `~$* before evaluating anything else. You effectively catch the engine halfway through, and concatenate the string after the $* is replaced, but before it is evaluated for each token.
Hope that makes sense, I waffled a bit