Whilst while loops can be used to accomplish the same thing as $* (albeit using a much longer method), while loops aren't the topic being discussed here.

Here is why I think $* should be changed:

Take this script for example,

Code:
//tokenize 32 ~1 $!time ~3 | echo -a $*


Output:

~1
$time
~3

Now let's say that you want to manipulate each of those strings using $mid:

Code:
//tokenize 32 ~1 $!time ~3 | echo -a $mid($*,2)


This doesn't work and I think it should. At the moment you have to introduce some kludgy workaround which can introduce unexpected results for scripters who are unaware of the side effects of commands that evaluate parameters twice. Consider this:

Code:
//tokenize 32 ~1 $!time ~3 | scid -r echo -a $!mid( $* ,2)


Output:

~1
21:01 (or whatever the current time is)
~3

This is clearly evaluating $!time twice, which is where the undesired behaviour comes in from workarounds like this. It also looks messy and hard to follow.

The real danger would come when somebody uses a script like this:

Code:
on ^*:text:*:#:{
  echo # $+(<,$nick,>)
  scid -r echo # $+(~, $* ,~)
  haltdef
}


..which would of course evaluate anything that was said on the channel.