El XML que obtienes es correcto. Es XML , no texto, y legible como XML por un analizador XML. Los caracteres especiales se escapan correctamente, como debería ser. Cualquiera que sea el módulo de cliente que tenga que consuma ese XML, debe analizarlo como XML, no como texto, y luego se mostrará correctamente.
Actualización:
En caso de que no esté claro, todo lo que necesita hacer en su consulta es tratar XML como XML y texto como texto, no mezclar XML como texto, es decir:
;WITH CodeValues AS
(
SELECT
Number,SUBSTRING(@R,Number,1) AS R,ASCII(SUBSTRING(@U,Number,1)) AS UA
FROM Numbers
WHERE Number<=LEN(@R)
)
, XmlValues AS (
SELECT
t.RowID
,(SELECT
''+c.R
FROM Numbers n
INNER JOIN CodeValues c ON ASCII(SUBSTRING(t.Unreadable,n.Number,1))=c.UA
WHERE n.Number<=LEN(t.Unreadable)
FOR XML PATH(''), TYPE
) AS readable
FROM @TestTable t)
SELECT x.RowId,
x.readable.value('.', 'VARCHAR(8000)') as readable
FROM XmlValues AS x