100% гарантии локальными средствами не получишь, onbeforeunload может не исполниться по разным хоть и редким причинам (например убили процесс, или проблема с интернетом, или неудачное стечение обстоятельств при пробуждении ото сна, особенно это актуально для мобильных браузеров), поэтому ключевой вопрос задачи - обнаружить закрытие вкладок, что можно сделать только на серверной стороне, удерживая websocket подключение (сервер считает сколько открыто к какому пользователю подключений и на дисконнекте последнего помечает что сессия закончилась).
В этом случае очистку localstorage придется делать и на открытии страницы, если сервер пометил для себя что сессия была закрыта и устарела