Actually I think it's the chunk of code between each run that counts, not the actually looping. Try doing some list handling to run through the list instead of counting through it:
(defun repeat_it (lst / cnt)
(setq cnt 0)
(startTimer)
(repeat (length lst)
(expt (car lst) 2.0)
(setq lst (cdr lst))
)
(endTimer "repeat_it")
)
(repeat_it alist)
Timed repeat_it: 0.094025
A quite noticable change!