Делал как раз такое когда верстал для LDZ, так что можно подглядеть реализацию
у них на сайте (самое верхнее меню). В целом думаю что можно обойтись и без JavaScript, просто такой задачи в том проекте не стояло. Сама идея тривиальная:
Есть две копии меню: одна для горизонтального меню другая - для вертикального. Для горизонтального меню используется flexbox с flex-wrap и ограничение высоты в 1 строку с overflow: hidden. Для вертикального - обычный список. Основная задача - при клике на триггер показа вертикального меню взять все пункты меню из горизонтального варианта и либо скопировать их в вертикальное либо перенастроить видимость пунктов вертикального меню в зависимости того "завёрнуты" ли соответствующие пункты горизонтального меню в дополнительные строки.