Как переписать вызов setTimeout, что бы избавиться от расхода памяти?
Память на самом деле не течет в данном случае. Вам надо было немного подождать и GC сделал бы свое дело. Все экземпляры вызовов, которые не возвращают ссылок были бы уничтожены (в данном примере это так).
В некоторых случаях можно использовать requestAnimationFrame.