Well as I tried to explain .. using $ulevel can't work.
That alias would be freezing rather than crashing miRC. You have bracket mismatches and the /dec is outside the while { }....


Edit: Try this...
Code:
on me:*:join:#needhelp:inc %who. $+ # | who #
raw 315:*:{
  if %who. [ $+ [ $2 ] ] {
    unset %who. $+ $2
    .timer 0 60 check.idlers $2
    halt
  }
}
alias check.idlers {
  if $chan($$1).ial != $true { echo -ec i $1 IAL is not full for $1 | return }
  if $me !isop $1 { echo -ec i $1 You are not opped on $1! | return }
  var %i = 1
  while $nick($1,%i,r) {
    %a = $ifmatch
    if !$istok(10 11,$level($ial(%a)),32) && $nick($1,%a).idle > 20 {
      ban -ku300 $1 %a 2 Please do not idle. Return in a while if you need help or want to help.
    }
    inc %i
  }
}
raw 352:*:if %who. [ $+ [ $2 ] ] { halt }

To use it as an /alias you must specify the #channelname.. /check.idlers #needhelp

Edit again: Added check for your op status.