Ufff... yo haría todo bastante diferente
Para empezar quitaba ese Application.ProcessMessages porque lo enlentece muchísimo (pondría simplemente el cursor del ratón con el reloj de arena).
Tampoco haría un commit cada 500 registros, si son varios millones, los haría al menos cada diez mil o algo así, tendría que hacer pruebas.
Además aprovecharía en ese instante que hace commit para hacer el application.processmessages
Luego, lo de pasar a un stringlist y luego a una tabla en memoria... no acabo de entenderlo, en principio me parece trabajo doble.
En fin, que tendría que conocer mejor todo lo que haces para decidir una cosa u otra.