Попробуйте
result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]");
В качестве прокомментированного регулярного выражения:
( # capture the following in backref 1:
\[\d\] # first occurrence of [digit]
\[ # [
[^\]]+ # any sequence of characters except ]
\] # ]
) # end of capturing group
\[\d\] # match the second occurence of [digit]
Если число [xxx]
групп между первой и второй [digit]
группами является переменным, тогда используйте
result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]");
Окружая часть, которая соответствует [xxx]
группам, с (не фиксирующими) круглыми скобками и ленивым квантификатором *?
Я прошу механизм регулярных выражений сопоставить как можно меньше таких групп, но столько, сколько необходимо поэтому следующая группа - это [digit]
группа.