(let ((a 1))) устанавливает значение a в 1 до точки, где закрывающая скобка, которая совпадает с открывающей скобкой до того, как будет достигнуто значение let, в этот момент возвращается к тому, что было предыдущим значением ( становится неопределенным). Вы часто видите в теле функции let, где вам требуются локальные переменные, которые должны выходить из области видимости в конце функции, поэтому вы должны использовать let там.
(setf a 1) устанавливает a в 1 и предполагает, что либо a было ранее определено (либо с помощью defparameter, defvariable, либо let), либо что a - это новая специальная переменная, которой необходимо значение.
Это немного сложнее, но я не уверен, что у меня есть отбивные, чтобы объяснить это.