In CHECK-FOR-WIN:
COND is a poor choice for what it should have done. Think about it: you want the function to return T if any of the IS-LINE returns T and NIL otherwise. Well, that pretty much determines what OR is doing, so drop the COND and put the IS-LINE calls into one OR. You can use SOME to cut it even further, but it may be too smart.
In IS-LINE
Let's take it inside out: firstly, EQL is transitive, so if you know (EQL AB) and (EQL AC), then it is redundant for validation (EQL BC).
Now that IF is absolutely unforgivable. This, literally, is the same as doing
if (x) return true; else return false;
in the language of figures. You already have a truth value that you want return, so just return it.
Finally, this is a bad style for shadow variables, as you do with LET. In any case, I would say that by dropping one EQL, you will reduce the need to pre-compute the refs array to almost zero anyway.
Generally
A convention in Common Lisp to denote predicates (functions that return either T or NIL) to come up with a noun that describes what they are testing, and stick with "p". I think WINNING-POSITION-P and CELLS-MATCH-P will be the best names.
I think it would be nice to write a function to get the content of the square of the board, as opposed to using AREF, since the latter provides details of its implementation. Even if this is a relatively minor problem, in this case it is a good habit to join.
Following these suggestions, you will receive the following code:
(defun winning-position-p ()
(or (cells-match-p 1 2 3)
(cells-match-p 1 4 7)
(cells-match-p 1 5 9)
(cells-match-p 2 5 8)
(cells-match-p 3 6 9)
(cells-match-p 3 5 7)
(cells-match-p 4 5 6)
(cells-match-p 7 8 9)))
(defun cells-match-p (abc)
(and (eql (board-ref a)
(board-ref b))
(eql (board-ref a)
(board-ref c)))
(defun board-ref (cell)
;; Could check for errors here.
(aref * board * (1- cell)))