Попробуйте добавить флаг g
(который допускает более одной замены на строку), так что это так:
$text = preg_replace('/\\\\u([0-9a-f]{4})/ig', '&#x$1;', $text);
Edit:
Ваш код, как написано, работает для меня:
php > $text = "\u00f6\u00df";
php > print $text;
\u00f6\u00df
php > $text2 = preg_replace('/\\\\u([0-9a-f]{4})/i', '&#x$1;', $text);
php > print $text2;
öß