Здрасти,
първо да кажа, че идеята за решението е добра. Грешката поради която зацикля е на реда:
(set-cdr! l1 (append (enum (car l1) (cadr l1))(cdr l)))
Трябва да се смени на:
(set-cdr! l1 (append (enum (car l1) (cadr l1))(cdr l1)))
Иначе завързваш по някое време края на списъка за началото му и получаваш зациклена структура. Освен това има още един проблем - в началото на функцията insert1 вземаш cadr на l1, а не си сигурна, че има такъв. Затова е добре да промениш проверката (null? l1) на (null? (cdr l1)).
Изобщо първият параметър на функцията ти е излишен, мисля, че го използваш само за да връщаш списъка на края на процеса, но това можеш да го направиш, като добавиш l1 най-накрая във тялото на insert1. Така функцията винаги ще ти връща параметъра си, върху който е работила деструктивно.