Насколько я вижу, Ваш код должен бы работать корректно вне зависимости от расположения ключевых слов.
Единственное что может ему помешать, это вот это регулярное выражение
var expr = new RegExp('(?!<a.*>.*)('+lv.word+')(?!.*</a>)', 'i');
Во первых надо бы добавить модификатор m чтобы оно поддерживало многострочность
Во вторых вот в этом куске ?!.* надо бы обрезать жадность квантификаторов ?!.*?
И вот тут тоже <a.*>.* становиться <a.*>.*?
php.net/manual/pl/regexp.reference.repetition.php
Возможно причина именно в жадности квантификаторов?
Также данный код отработает только первое совпадение, чтобы отработать все надо добавить модификатор "g".