При изменении темы сохранять актуальное состояние на сервере и при следующем посещении рендерить html сразу с атрибутом.
Положить значение в localStorage (sessionStorage, cookies) и при перезагрузке страницы вынимать из хранилища и добавлять атрибут в html. (Но в этом случае будет работать только в текущем браузере, на текущем устройстве)
Нюанс: я скопировал твой код, но в нем есть или логические ошибки или лишний код. Например код написан так что тема зависит не от того что выбрано в выпадающем списке а от того какая тема установлена в аттрибуте body.
С кодом возможны еще нюансы, например если скрипт включен в head без аттрибута deferred, то в момент запуска скрипта в ДОМ-е может не быть #theme-link и body.
Код который я написал - примерный. Я его не запускал. Его нужно понять и разобраться почему не работает. Дебажить умеешь? Посмотри на ошибку в консоли если есть, убедсись что код запускается (например вставь alert(1) в тело init).