Você está perdendo um espaço após o protocolo.
header($_SERVER['SERVER_PROTOCOL'] . ' 406 Not Acceptable'); //This works
header($_SERVER['SERVER_PROTOCOL'] . '406 Not Acceptable'); //This doesn't work.
Eu obtive o mesmo resultado que você estava vendo. Com o espaço faltando, o Nginx interceptou a resposta e deu uma página de erro 502. Ele passa o 406 até quando o espaço está lá.