hmmm.. ok, since that didn't work (though I don't understand why not), give this a try. It shouldn't lock up, as it uses mIRC's /filter command to get the output, rather than looping.
Code:
on *:join:#:{ 
  .write $qt($scriptdirtracker.txt) ( $time(HH:nn:ss) on $adate ) - $address - $nick 
}
on *:text:!find*:#:{ 
  find $nick $2
} 
alias -l find { 
  if !$2 {    .notice $1 Usage !find <nick>  } 
  else { 
    if !$read($qt($scriptdirtracker.txt),w,$+(*,$2)) { 
      .notice $1 No matches for $2 found 
    } 
    else { 
      var %infile = $qt($scriptdirtracker.txt), %outfile = $qt($scriptdirtracker.tmp)
      filter -fft 9 32 %infile %outfile $+(*,$2)
      .play $nick %outfile
    }
  }  
}
on *:playend:{
  if %outfile && $filename == %outfile {
    .remove %outfile
  }
}