Kuck dir deinen Code an: Keine Schleifen, nix was wiederholt wird, innerhalb deines Codes. Also hast du auch keine Möglichkeit, da per Application.ProcessMessages o.ä. was zu regeln. Bleibt also der Thread.
Was ist so schlimm daran, einen Thread einzusetzen? Auf deinem System dürften ein paar Hundert laufen, da kommts auf einen mehr auch nicht an

Eine Animation, wie der Explorer sie beim Kopieren zeigt, dürfte weit mehr Zyklen beanspruchen als der Overhead durch den Thread verursacht.