forse una cosa di questo tipo:
while(1) {
str.replace(/^(.+?\[inizio\].*?)\<(.*?\[fine\].+)$/,"$1<$2");
tmp = $1
str.replace(/^(.+?\[inizio\].*?)\>(.*?\[fine\].+)$/,"$1>$2");
if(tmp.length==0 && $1.length==0) break;
}
Spero di aver interpretato correttamente la domanda.