при нахождении hello, код захватывает и следующий символ
И следующий и предыдущий.
Потому что у вас в регулярке так и написано:
([^{L}]|^) сохранить в подмаску не {L} или символ начала строки
И после ([^{L}]|$) - сохранить в другую подмаску не {L} или символ конца строки.
Здесь уместнее негативные ретроспективные и опережающие проверки. Но JS не умеет ретроспективную проверку.
Если нет желания читать "Регулярные выражения" Джеффри Фридла (хотя весьма рекомендую) то вот статья по позиционным проверкам:
habrahabr.ru/post/159483