Ничего странного нет.
Вы указываете ему сколько заменить а
НА СКОЛЬКО (четвёртый параметр функции)
не указали. Вот он и допихивает после замены остальное, сдвигая при этом то, что было.
Как то так:
ba->replace(lastPos, ba->size(), reply->readAll(), reply->bytesAvailable());
Или если Вам нужно оставить то, что было в исходном массиве, то и вторым и четвёртым параметром укажите одинаковое значение - сколько заменять, т.е. reply->bytesAvailable()
Надеюсь, заработает, но лучше свериться с документацией.
Пример работает потомучто строка такой же длины как и сколько нужно заменить, поэтому впихивать уже нечего.