Это возможно только в специально созданных случаях, вроде:
case class A(var a: A)
val a = A(null)
a.a = a
В таких случаях еще много чего будет фейлится, вроде toString и hashCode.
Тут можно еще вставить только проверку на null, и его лифтить правильно. Чтобы полностью избавиться от переполнения стека, вижу только один вариант - не использовать рекурсивно Lift.apply, а писать свой метод, который будет проверять на цикл.