Отказ от ответственности: это не эффективный способ сделать это в Elisp. Эффективный способ через хэш-таблицу с хэш-функцией, но так как вы просили о списках, то вот оно:
(defun custom-set-difference (a b)
(remove-if
#'(lambda (x) (and (member x a) (member x b)))
(append a b)))
(custom-set-difference '(1 2 3 4 5) '(2 4 6))
(1 3 5 6)
(defun another-set-difference (a b)
(if (null a) b
(let (removed)
(labels ((find-and-remove
(c)
(cond
((null c) nil)
((equal (car c) (car a))
(setq removed t) (cdr c))
(t (cons (car c) (find-and-remove (cdr c)))))))
(setf b (find-and-remove b))
(if removed
(another-set-difference (cdr a) b)
(cons (car a) (another-set-difference (cdr a) b)))))))
(another-set-difference '(1 2 3 4 5) '(2 4 6))
(1 3 5 6)
Второго чуть более эффективны, потому что он будет удалять элементы, как это делает последующее но первый - короче и более прямой.
Также обратите внимание, что списки не являются хорошим представлением множеств, потому что они, естественно, позволяют повторять. Хэш-карты лучше для этой цели.