Common Lisp は末尾呼び出しの最適化を保障してないから、
永久ループを再起呼び出しで書いちゃダメ。
quasiquote の意味がわかってないんじゃない?
do-forever 内に do-forever を書くとマクロ展開が終わらなくなるよ。

というのは置いといて、
スタックオーバーフローしていいならこれでどう?
(defmacro do-forever (&body body)
(let ((g (gensym)))
`(block nil
(labels ((,g () (progn ,@body) (,g)))
(,g)))))