Kommt darauf an, wie genau dein Code aussieht.
Aber das Grundproblem liegt darin, dass AutoIt Single-Threaded ist. Es kann also immer nur ein Code gleichzeitig ausgeführt werden.
Man kann mit bestimmten (Interrupt-) Methoden (wie Adlibregister, dein _ProgressProc,...) Code "nebenbei" ausführen, aber das sorgt auch nur dafür, dass der Hauptcode angehalten wird, die Funktion durchläuft und dann der Hauptcode weiter ausgeführt wird.
Sleep-Befehle in solchen "Interrupt" Methoden sind also sehr schlecht, weil dadurch die Hauptschleife angehalten wird und ähnlich sollte man aufpassen, dass man den Hauptcode nicht zu lange blockiert.
Wenn du deinen Code postest, können wir dir da bei der Optimierung helfen.
In anderen Programmiersprachen kann man asynchron programmieren (was der Art von AutoIt am ähnlichesten ist), wobei auf einem Kern abwechselnd verschiedener Code ausgeführt wird.
Dann gibt es multithreading, was meist genutzt wird, um Dinge parallel auszuführen und auch mehrere unterschiedliche CPU-Kerne zu nutzen, aber gleichzeitig den Arbeitsspeicher zu teilen.
Zum Schluss gibt es noch multiprocessing, wo man mehrere Programme nebeneinander laufen lässt, die miteinander kommunizieren (Networking (TCP)/Files/...). Das könntest du hier auch gut verwenden, wenn das "asynchrone" in AutoIt nicht so gut klappt. Dann würdest du deine Anwendung mit Parametern nochmal aufrufen, die dann den Download durchführen und mit deinem Tool (Mit TCPAccept/TCPSend/TCPReceive/...) die Prozentzahl kommunizieren, abbrechen, pausieren,... . Da du dafür aber einen kleinen Server/Client programmieren müsstest, wäre das aufwendiger.