a string has a certain character level syntax: alphanumeric characters and escaped characters. Last I looked strings were part of the C syntax, but the C syntax was not based on strings. OTOH Lisp syntax is built on top of S-expressions, a data syntax.
Yes but I thank that is a rather minor point. I don't think people are usually thinking of character level syntax when they say that Lisp is homoiconic and C is not.
Also it seems like it would be possible to define a variant of C that did use identical external representations for source code and strings. Such a language would still be essentially C and would be no (or at best only marginally) more homoiconic than is conventional C.
Sure you could define a variant of C. But C itself is how it is. C external source code is not defined on top of a data syntax. C also does not have any structured data representation for its source code and is not defined to work on that.