Ich nehme mal grob an, dass du mit Hilfe des Timer ne Uhr realisieren willst, die anzeigt, wieviele Sekunden deine Operation braucht.
Abgesehen davon, dass deine Timer-Routine während der Schleife nicht aufgerufen wird (Stichwort Application.ProcessMessages), ist deine Methode denkbar ungeignet, um die Zeit zu messen. Das liegt an dem Handling von Strings (und memo.text ist ein String).
Folgendes passiert in etwa in deiner Schleife:
Durchlauf 1:
Setze den Text auf '1'. Ok.
Durchlauf 2.
Text soll verlängert werden.
Reserviere dafür neuen Speicherplatz.
Kopiere alle 1 Zeichen des alten Strings dahin, und füge '1' hinzu.
Ergebnis '11'
Durchlauf 3:
Text soll verlängert werden.
Reserviere dafür neuen Speicherplatz.
Kopiere alle 2 Zeichen des alten Strings dahin, und füge '1' hinzu.
Ergebnis '111'
Durchlauf 3:
Text soll verlängert werden.
Reserviere dafür neuen Speicherplatz.
Kopiere alle 3 Zeichen des alten Strings dahin, und füge '1' hinzu.
Ergebnis '1111'
...
Durchlauf 3000:
Text soll verlängert werden.
Reserviere dafür neuen Speicherplatz.
Kopiere alle 3000 Zeichen des alten Strings dahin, und füge '1' hinzu.
Ergebnis '1111111[...]11111'
...
Durchlauf 2.000.000:
Text soll verlängert werden.
Reserviere dafür neuen Speicherplatz.
Kopiere alle 2.000.000 Zeichen des alten Strings dahin, und füge '1' hinzu.
Ergebnis '1111111[...]11111111111'
Du hast also nicht 2.400.000 Operationen, sondern größenordnungsmäßig 2.880.000.000.000 Operationen (1+2+3+4+5+6+...) Und das ist auch auf ner schnellen CPU viel zu tun

We are, we were and will not be.