Кажется, это как-то связано с escape-персонажем. Я пробовал Chrome Инструменты разработчика, работающие в следующих двух строках.
1. Without Template Literal
new RegExp("^\%B(\d+)\^(\w+)\/(\w+)\^\d+\?;\d+=(\d\d)(\d\d)\d+$").exec('%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?')
result: null
2. With Template Literal
new RegExp($`{"^\%B(\d+)\^(\w+)\/(\w+)\^\d+\?;\d+=(\d\d)(\d\d)\d+$"}`).exec('%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?')
result: ["O", index: 20, input: "%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?", groups: undefined]
Оборачивание выражения Regex в литерале шаблона должно решить проблему. Процесс компиляции, вероятно, принял во внимание символы подстановки во время сборки, что говорит о том, почему он работает после компиляции.