Как проверить сбалансированность открывающих и закрывающих символов?
Правильное решение такой обощенной задачи - использовать стек. 
Надо первую строку обработать последовательно, символ за символом. При получении открывающего символа в строке надо его положить в стек. При получении закрывающего символа - надо проверить, что на вершине стека лежит правильный открывающий символ и удалить его из стека. В конце надо проверить, что стек пуст. Если стек не пуст в конце, или где-то в процессе работы в стеке был не тот символ - строка не сбалансированна.
Для удобства реализации из второго параметра нужно выделить "открывающие" и "закрывающие" символы. Удобно в массиве из 256 элементов пометить все открывающие как-то (например, -1), Все закрывающие надо пометить номером соответствующего открывающиего символа. Т.е. для второго параметра "()[]". Для всех символов в массиве будет 0, но для '(' и '[' - будет -1. Для ')' будет в массиве хранится '(', а для  ']' - '['.
Тогда, при обработке символа из первой строки, если в массиве для него 0, то просто пропускаем. Если -1 - то кладем в стек. Если что-то другое, то проверяем, что это значение лежит в стеке на вершине. 
Ваше решение по ссылке на работает на тесте "())("
я на codewars решал так) ессесно можно расширить под любые скобкиfunction validBraces(b){
  let reg = /\(\)/g;
  b = b.replace(/[^\(\)]/g,'')
  
  return b.match(reg) != null ? validBraces(b.replace(reg,'')) : b === "" ? true : false;
}

console.log(validBraces("(Sensei saysno) (sd) (sdfsf"));