Ummm... acho que é o correto maneira na verdade.
\u00df é uma representação unicode correta de ß . Quando você json_decode() de volta, ele se tornará ß novamente. Onde isso está causando problemas para você? A extremidade receptora não está decodificando corretamente? Deveria se você usar o padrão
json_* funções. Todos os exemplos no manual mostram a mesma coisa - caracteres além do intervalo ASCII são transformados em sequências numéricas.