forse una cosa di questo tipo:

while(1) {
str.replace(/^(.+?\[inizio\].*?)\<(.*?\[fine\].+)$/,"$1&lt;$2");
tmp = $1
str.replace(/^(.+?\[inizio\].*?)\>(.*?\[fine\].+)$/,"$1&gt;$2");
if(tmp.length==0 && $1.length==0) break;
}

Spero di aver interpretato correttamente la domanda.