Любой полуприличный сборщик мусора будет обрабатывать циклы.
Циклы являются проблемой, только если вы делаете наивный подсчет ссылок.
Большинство сборщиков мусора не выполняют пересчет (как потому, что он не может обрабатывать циклы, так и потому, что он неэффективен). Вместо этого они просто следуют каждой ссылке, которую могут найти, начиная с «корней» (обычно глобальных переменных и переменных на основе стека), и отмечают все, что могут найти, как «достижимые».
Тогда они просто восстанавливают всю другую память.
Циклы не являются проблемой, поскольку они просто означают, что один и тот же узел будет доступен несколько раз. После первого раза узел будет помечен как «достижимый», поэтому GC будет знать, что он уже там, и пропустит узел.
Еще более примитивные GC, основанные на подсчете ссылок, обычно реализуют алгоритмы обнаружения и прерывания циклов.
Короче, вам не о чем беспокоиться.
Кажется, я вспоминаю, что Javascript GC в IE6 на самом деле не справлялся с циклами (я могу ошибаться, прошло много времени с тех пор, как я его читал, и прошло гораздо больше времени с тех пор, как я коснулся IE6), но в любой современной реализации это проблема.
Весь смысл в сборщике мусора - абстрагироваться от управления памятью. Если вам придется выполнять эту работу самостоятельно, ваш GC не работает.
См. MDN для получения дополнительной информации о современной сборке мусора и используемых алгоритмах разметки и очистки.