I have done some more research into this & it seems to be all com's fault, so nothing mirc can do about it frown
I also found the script issue, the .timer 1 0 .comclose line was causing the issue when the commands were used quickly

Fixed version....

Code
; $1- = item to execute & args
; or if $prop is set
; $1 = com object returned by exec()
; $prop = Terminate or pid or Status or eos or Line or ReadLine or WriteLine or debug
alias exec {
  if ($0 == 0) return
  if ($prop) {
    if (!$com($1)) return
    if ($prop == Terminate) noop $com($1,Terminate,1)
    elseif ($prop == pid) noop $com($1,ProcessID,2)
    elseif ($prop == Status) noop $com($1,Status,2)
    elseif ($prop == EOS) {
      ; BUG: causes mirc to freeze when used on a running task when it should return $true! Unfreezes on task exit.
      var %exec_stdout exec_stdout $+ $ticks
      if ((!$com($1,StdOut,2,dispatch* %exec_stdout)) || ($comerr)) return -1
      if ((!$com(%exec_stdout,AtEndOfStream,2)) || ($comerr)) var %res = -2
      else var %res = $com(%exec_stdout).result
      .comclose %exec_stdout
      return %res
    }
    elseif ($prop == ReadLine) {
      ; BUG: causes mirc to freeze when used on a running task when it should return 0! Unfreezes on task exit.
      ; NB: results can be an empty line, 1 used to make it clear this is a good result
      var %exec_stdout exec_stdout $+ $ticks
      if ((!$com($1,StdOut,2,dispatch* %exec_stdout)) || ($comerr)) return -1
      if ((!$com(%exec_stdout,AtEndOfStream,2)) || ($comerr)) var %res = -2
      elseif ($com(%exec_stdout).result) var %res = 0
      elseif ((!$com(%exec_stdout,ReadLine,1)) || ($comerr)) var %res -3
      else var %res = 1 $com(%exec_stdout).result
      .comclose %exec_stdout
      returnex %res
    }
    elseif ($prop == WriteLine) {
      var %exec_stdin exec_stdout $+ $ticks
      if ((!$com($1,StdIn,2,dispatch* %exec_stdin)) || ($comerr)) return -1
      if ((!$com(%exec_stdin,WriteLine,1,bstr,$2)) || ($comerr)) var %res = -3
      else var %res = 1
      .comclose %exec_stdin
      return %res
    }
    elseif ($prop == Line) {
      var %exec_stdout exec_stdout $+ $ticks
      if ((!$com($1,StdOut,2,dispatch* %exec_stdout)) || ($comerr)) return -1
      if ((!$com(%exec_stdout,Line,2)) || ($comerr)) var %res = -2
      else var %res = $com(%exec_stdout).result
      .comclose %exec_stdout
      return %res
    }
    elseif ($prop == debug) {
      echo -s start
      var %exec_stdout exec_stdout $+ $ticks
      if ((!$com($1,StdOut,2,dispatch* %exec_stdout)) || ($comerr)) return -1
      echo -s got stdout
      if ((!$com(%exec_stdout,AtEndOfStream,2)) || ($comerr)) var %res =  -2
      else {
        echo -s got AtEndOfStream
        var %res = $com(%exec_stdout).result
      }
      echo -s ok
      .comclose %exec_stdout
      return %res
    }
    else return
    return $com($1).result
  }
  var %% = s $+ $ticks, %exec_com = $+(%%,_exec), %exec_stdout = %exec_com $+ _stdout.txt
  if (!$com(%%)) .comopen %% wscript.shell
  if ($comerr) return
  .comclose %% $com(%%,exec,1,bstr,$1-,dispatch* %exec_com)
  return %exec_com
}