Вероятно, потому что preg_match заканчивает свою работу после первого вхождения искомой строки в исходную.
После того как ты нашел первое вхождение a, дальше ничего не перебирается.
if ( preg_match( "/a/miu", $text ) )
а тут ты не продолжаешь поиск, а ищешь опять с начала строки и найдя bab preg_match прекратит работу, условие выполнится как истина, preg_replace поменяет bab, а в else будет работать если вообще bab не будет в строке.
if ( preg_match( "/bab/miu", $text ) )