Потому что строки неизменны, метод replace не может изменить исходную строку (как и любой другой метод) и он возвращает новую строку в которой все заменено. В первом случае, каждый последующий вызов действует на строку возвращенную предыдущем и в итоге возвращает правильный результат.
А еще ненужно в конце цикла писать continue, оно и так перейдет. И обнулять переменную с помощью конструкций = str()
Пример:
In [4]: a = "abc"
In [5]: b = a.replace("a", "1")
In [6]: print(a,b)
abc 1bc