J'ai trouvé comment le résoudre, alors j'espère que cela sera utile à quelqu'un.
Tout d'abord, SQL_Latin1_General_CP1_CI_AS est un étrange mélange de CP-1252 et UTF-8. Les caractères de base sont CP-1252, c'est pourquoi tout ce que j'avais à faire était UTF-8 et tout fonctionnait. Les caractères asiatiques et autres caractères UTF-8 sont encodés sur 2 octets et le pilote php pdo_mssql semble détester les caractères de longueur variable, il semble donc faire un CAST vers varchar (au lieu de nvarchar) puis tous les caractères de 2 octets deviennent des points d'interrogation (' ?').
Je l'ai corrigé en le convertissant en binaire, puis je reconstruis le texte avec php :
SELECT CAST(MY_COLUMN AS VARBINARY(MAX)) FROM MY_TABLE;
En php :
//Binary to hexadecimal
$hex = bin2hex($bin);
//And then from hex to string
$str = "";
for ($i=0;$i<strlen($hex) -1;$i+=2)
{
$str .= chr(hexdec($hex[$i].$hex[$i+1]));
}
//And then from UCS-2LE/SQL_Latin1_General_CP1_CI_AS (that's the column format in the DB) to UTF-8
$str = iconv('UCS-2LE', 'UTF-8', $str);