\documentclass{article}
\usepackage{ucharclasses}
\newXeTeXintercharclass \QuotationMarkClass
\XeTeXcharclass `` = \QuotationMarkClass
\XeTeXcharclass `' = \QuotationMarkClass
\XeTeXinterchartoks \QuotationMarkClass \BasicLatinClass {\kern 1pt}
\XeTeXinterchartoks \BasicLatinClass \QuotationMarkClass {\kern 1pt}
\hyphenation{hair-space}
\begin{document}
\XeTeXinterchartokenstate=0
Between quotation marks and the quoted text there must needs be a `hairspace'.
But using character classes to insert one ruins hyphenation.
\XeTeXinterchartokenstate=1
Between quotation marks and the quoted text there must needs be a `hairspace'.
But using character classes to insert one ruins hyphenation.
\end{document}
\documentclass{article}
\hyphenation{hair-space}
\begin{document}
Between quotation marks and the quoted text there must needs be a `hairspace'.
But using character classes to insert one ruins hyphenation.
Between quotation marks and the quoted text there must needs be a `\kern1pt
hairspace\kern1pt'\kern1pt. But using character classes to insert one ruins
hyphenation.
\end{document}
If you use \hspace or \hskip instead hyphenation is allowed again:
% arara: xelatex
\documentclass{article}
\usepackage{ucharclasses}
\newXeTeXintercharclass \QuotationMarkClass
\XeTeXcharclass `` = \QuotationMarkClass
\XeTeXcharclass `' = \QuotationMarkClass
\XeTeXinterchartoks \QuotationMarkClass \BasicLatinClass {\hskip1pt\relax}
\XeTeXinterchartoks \BasicLatinClass \QuotationMarkClass {\hskip1pt\relax}
\hyphenation{hair-space}
\begin{document}
\XeTeXinterchartokenstate=0
Between quotation marks and the quoted text there must needs be a `hairspace'.
But using character classes to insert one ruins hyphenation.
\XeTeXinterchartokenstate=1
Between quotation marks and the quoted text there must needs be a `hairspace'.
But using character classes to insert one ruins hyphenation.
\end{document}