A menos que você use extensões Common Lisp, como sugerido por @legoscia, você precisa verificar se o argumento opcional foi especificado. Observe que você realmente não precisa usar letaqui. Isso me parece mais idiomático:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
Conforme sugerido nos comentários, unlesspode ser preferível usar or:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
Também a partir dos comentários: o estilo funcional mais puro seria o de usar let, como na pergunta original, mas você não precisa de nomes de variáveis separados:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
Obviamente, se o parâmetro opcional for necessário apenas uma vez, você deve fazer isso:
(defun my-command (a &optional b)
(command-body a (or b default)))
setqem uma forma booleana "pura"or. Na minha opinião,whené definitivamente mais apropriado aqui, mas geralmenteleté a expressão de escolha para estabelecer ou alterar ligações locais. IOW, o código original parece muito melhor para mim.