Grazie a tutti e due!
Ho dato un occhio a soluzioni multithreading, devo cambiare la logica del programma, ma in effetti sembra l'unica soluzione.

Ho provato anche il secondo esempio (Timer-Adesso), ma il risultato non cambia, programma fluido e cpu a palla.
Per curiosità ho provato a fare un ciclo (infinito), la cpu sale molto nonostante il doevents.
codice:
do
 DoEvents
Loop
Quindi il problema sembra essere proprio il ciclo. Nonstante il programma rimanga fluido non posso permettermi di mandare la cpu a palla perchè sono in un ambiente virtuale e blocco gli altri utenti.
Con la Sleep la cpu rimane libera, ma blocco il programma.
Capra o cavoli?
Forse VB non è il linguaggio giusto per salvare entrambi...

Ciao!!!