Several quick style observations:
1) "(eq in-quote t)" should be just "in-quote"
2) "(eq in-quote nil)" should probably be "(not in-quote)"
3) PUSH has the side effect of setting the place, so
"(setq token (push char token))" should be "(push char token)"
4) COND clauses have an implicit PROGN for multiple forms, so you don't need it.
5) Many programmers put the WITH clauses ahead of the FOR clause in the loop since they are only evaluated once at the start of the form and before any iterations.
Design notes:
1) I would make the CSV function take a stream as its input rather than a string. You could then call it with more general inputs.
2) I might also call your function something like READ-CSV-LINE.
3) Do you really want commas outside of quotes do nothing? Or should then be token terminators as well?
Finally, you might also just use a CSV reader library.
http://www.cliki.net/Data%20formats has a couple of libraries listed for parsing CSV files. I think there should also be some that are available via quick-lisp.