Я бы сделала так.
Страница со списком документов загружается как обычно, попутно подгружается список тэгов, который хранится как обычный массив строк, привязанный к профилю пользователя, сформированный как описано в вашем варианте номер 1. (Делать отдельную коллекцию для простых списков смысла не вижу, всегда лучше начинать с минимизации сущностей - бритва Оккама, ага :)
Когда мы загружаем страницу со списком, идет подгрузка тэгов. Все последующие обращения к другим страницам делаются асинхронно, следовательно, облако тэгов больше загружать не надо.
Я не знаю, что вы используете на клиенте, я работаю плотно с Angular, поэтому говорить могу только про него.
Технически это было бы сделано так - маршрут для списка документов прописан на сервере, идет возврат клиенту профиля со списком тэгов. А маршруты ангуляра содержат обращения к страницам. В случае первичной загрузки идет запрос на страницу номер 1 (как resolver для этого маршрута), последующие вызовы - просто асинхронно к выборке соответствующей страницы.
Добавление.
Автор поста задал дополнительный вопрос. Вы спрашивали, когда обновлять список. Вопрос не такой просто и очевидный. В идеальном варианте облако тэгов должно обновляться сразу же как только пользователь добавил или изменил существующие тэги. Если хотите реализовать именно эту функциональность, то можно сделать через сокеты (новый список тэгов посылается клиенту в браузер, это не сложно на самом деле). Другой вариант - отслеживать на сервере при сохранении документа, изменился ли список тэгов, и, если да, в ответе отправлять обновленный список и его на клиенте обновлять. Тоже ничего вариант, по-моему.