O XML que você obtém está correto. É XML , não texto e legível como XML por um analisador XML. Caracteres especiais são escapados corretamente, como deveriam ser. Qualquer que seja o módulo de cliente que você tenha que consuma esse XML, deve analisá-lo como XML, não como texto, e então ele será exibido corretamente.
Atualizar:
Caso não esteja claro, tudo que você precisa fazer em sua consulta é tratar XML como XML e texto como texto, não misturar XML como texto, ou seja:
;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