Попробуйте
$k = trim(preg_replace("/\\s\\S+$/u", "", $k));
Если в конце строки после замены остается несколько концевых пробелов, то регуляркой удаляется все, что идет после последнего пробела, а остальные остаются и скрипт входит в вечный цикл.
P.S. Или попробовать перед циклом убрать все переводы строк и лишние пробелы.
P.P.S. Для тестирования введите еще счетчик, чтобы избежать вечного цикла:
$c = 0;
while($v > 30 && $c < 100) {
$c++;
$k = preg_replace("/\\s\\S+$/u", "", $k);
$v = iconv_strlen($k, "utf-8");
}