Technically not. Parsing something through a recursive function is strangely faster in mIRC, than a loop/var. On average, 3/5ths the speed. This leads me to believe that $1- and $v1/$v2 are stored on the stack where as %x, etc are heap based.

Here's some code for you:
Code:
alias TestLoops {
  var %str = $str(a $chr(32),254)

  var %x = $uptime(system)
  LoopByStackA %str
  echo -- time taken for stack loop: $calc($uptime(system) - %x)

  %x = $uptime(system)
  LoopByHeap1 %str
  echo -- time taken for heap loop #1: $calc($uptime(system) - %x)

  %x = $uptime(system)
  LoopByHeap2 %str
  echo -- time taken for heap loop #2: $calc($uptime(system) - %x)
}

alias LoopByStackA {
  if ($0 == 1) {
    return
  }
  LoopByStackB $2-
}

alias LoopByStackB {
  if ($0 == 1) {
    return
  }
  LoopByStackA $2-
}

alias LoopByHeap1 {
  var %str = $1-
  var %x = $gettok(%str,0,32)

  while (%x != 1) {
    %str = $gettok(%str,2-,32)
    dec %x
  }
}

alias LoopByHeap2 {
  var %str = $1-

  while ($gettok(%str,2-,32) != $null) {
    %str = $v1
  }
}