The reason tokens aren't separated prior to evaluation in $*tok identifiers is to maintain consistency with the rest of the identifiers, whose parameters are first evaluated one by one and then their values are passed to the appropriate internal function. So I think we'll agree that if $*tok identifiers were to work like you want, they should either work differently from the rest (inconsistency) or the language should be redesigned. Whether the latter should happen is a different and very long discussion, but on this particular area, I think you're just not used to this way. Once you get to know the language, you'll find that you can do a LOT of things with strings very easily. In your case, for example, something like that would do the trick:
//var %a = $(hello $me&I'm using windows $os $bits $+ -bit&blah,0) | echo -a $($gettok(%a,$r(1,3),38),2)
$() is the same as $eval(). So what we're doing is wrap $(..,0) around the text, to prevent mirc from evaluating it. Then we feed it to $gettok(), which returns a specific token (with any identifiers left unevaluated). That token is then fed to $(..,2), which evaluates any identifiers/variables in it.