В таких случаях используют String.prototype.replace, передавая функцию вторым аргументом:
var insertValues = function (string, values) {
var counter = 0;
return string.replace(/\[name(\$|\d+)\]/g, function (match, index) {
if (index === '$') {
return values[counter++];
}
return values[index - 1];
});
}
var string = 'text text [name$] [name$] text text [name8] text [name$] text text text text',
values = ['VALUE_1', 'VALUE_2', 'VALUE_3', 'VALUE_4', 'VALUE_5', 'VALUE_6', 'VALUE_7', 'VALUE_8', 'VALUE_9', 'VALUE_10'];
console.log(insertValues(string, values));
Ещё хочу заметить, что если вы используете получившуюся строку в
$('body').html(result);
это подразумевает полное пересоздание практически всех элементов на странице, а не просто замену текста внутри них. Это может вызвать ощутимые проблемы.