Если вы посмотрите на источник TDictionary, вы обнаружите, что GetEnumerator (в его предке) вызывает DoGetEnumerator, который в TDictionary вызывает повторно введенную версию GetEnumerator.
Повторно введенный TDictionary.GetEnumerator создает экземпляр TPairEnumerator, передавая себя в качестве словаря для перечисления. Словарь не содержит ссылку на TPairEnumerator. PairEnumerator не получает уведомления об уничтожении своего словаря.
Итак, да, вам действительно нужно освободить перечислитель и, чтобы избежать любых нарушений прав доступа, вы действительно должны сделать это до уничтожения словаря, который он перечисляет.