Nie będę nawet próbował rozszyfrowywać tego kodu który podałeś.
Miałeś racje, zrobiłeś pętle, która się nigdy nie skończy.
W pętli, wartość zmiennej tekst[i] nigdy się nie zmienia, więc while(tekst[i]=!'<') przy wcześniejszym if'ie, zawsze będzie prawdziwy.
Tutaj wstawiam kod, który napisałem.
http://ideone.com/G2guGB
#include <iostream>
#include <string>
int main() {
std::string text = "HaLoo<hSssj>ss<asd>dS"; //Tekst do zamiany
std::size_t last = 0;
while (true) {
std::size_t startPos = text.find('<', last); //Znajdź znak '<' zaczynając od pozycji w zmiennej "last"
if (startPos == std::string::npos) //Jeżeli nic nie znalazło, zakończ pętle
break;
std::size_t endPos = text.find('>', last); //Znajdź znak '>'. Zakładamy że zapis zawsze będzie poprawny i dla każdego < będzie istniał >
for (int i = startPos; i < endPos; i++) //Zamień literki na ich wielkie odpowiedniki.
text[i] = toupper(text[i]);
last = endPos+1; //Zmien wartość zmiennej last, żeby nie znalazło znowu tej samej pary znaków < i >
}
std::cout << text; //Wypisz na ekran zmieniony tekst.
return 0;
}