You need to use an accumulator function. This way you can iterate the list while incrementing the two numbers you are interested in returning at the end:
(defun count-split (filter list)
(labels ((aux (list match no-match)
(cond ((null list) (values match no-match))
((funcall filter (car list)) (aux (cdr list) (1+ match) no-match))
(t (aux (cdr list) match (1+ no-match))))))
(aux list 0 0)))
Or a guaranteed to not blow stack loop
version (but it's not recursive):
(defun count-split (filter list)
(loop :for i :in list
:for total :from 0
:counting (funcall filter i) :into matched
:finally (return (values matched (- total matched)))))
And both works like this:
(count-split #'oddp '(1 2 3 4 5 6 7 8 9)) ; ==> 5; 4