Mas no JavaScript, muitos atalhos trabalham apenas com ASCII, não considerando caracteres acentudados. É o caso do \w (que significa "letras de a a z (maiúsculas e minúsculas), dígitos de 0 a 9 e o caractere _", sem considerar acentos). E como os atalhos \b e \B indicam posições da string levando em conta se antes e depois têm ou não caracteres alfanuméricos (ver explicação detalhada aqui), estes também não consideram letras acentuadas (em Python, o \w considera qualquer letra de qualquer alfabeto, incluindo as acentuadas, por isso o \b e \B também funcionam nestes casos).
Nos comentários foram dadas alternativas para fazer isso sem regex, mas tem um detalhe: o resultado só será igual se a string tiver apenas caracteres alfanuméricos. Veja o exemplo abaixo:
Repare que quando há caracteres não-alfanuméricos (como espaços e sinais de pontuação), sua regex só coloca o hífen entre dois alfanuméricos ou entre dois não-alfanuméricos (repare que foi colocado entre a vírgula e o espaço que há logo depois dela), pois o \B indica exatamente isso: uma posição da string na qual os caracteres antes e depois são do mesmo "tipo" (ou ambos são alfanuméricos, ou ambos não são). Mas quando há apenas um espaço separando 2 palavras, não é colocado o hífen entre elas (o mesmo vale para o final: antes do ? não é colocado o hífen, pois esta é uma posição em que antes há uma letra e depois não).