Я не думаю, что можно использовать потоки без копирования слова, поскольку поток всегда извлекает слово в отдельную строку. В вашей попытке вы также модифицируете такую копию, поэтому вы получаете исходную строку. Я бы просто использовал итераторы (это должно восприниматься как псевдокод, может не компилироваться):
auto last = s.begin();
auto cur = s.begin();
while (cur != s.end()) {
if (!isalpha(*(cur++))) {
reverse(last, cur);
last = cur;
}
}
reverse(last, cur);
return s;