Я не знаю всех тонкостей, но наивно считаю, что пока имя объекта в области видимости, его сборщик мусора не тронет. И наоборот. Нет?
Нет. Если бы всё работало как Вы описали, сборщик мусора был бы не нужен - объекты просто бы удалялись по мере выхода переменных из области видимости. Проблема в том что на один и тот же объект может быть несколько ссылок. Пример:
foo = let xs = [1, 2, 3] in (0 : xs)
Таким образом, область видимости переменной xs заканчивается, но ссылку на список xs хранит список foo, поэтому сборщик мусора ничего с xs не сделает. В целом сборщик мусора работает грубо говоря так - периодически считает сколько всего ссылок на объект, если их нет - удаляет объект. На самом деле современные алгоритмы сборки мусора намного сложнее, но общий принцип такой.