Прежде всего, беспокоиться о «производительности» рекурсии, когда вы читаете данные из реестра и помещаете данные в древовидный элемент управления, звучит немного глупо. Стоимость рекурсии находится в диапазоне наносекунд, а стоимость чтения из реестра - в диапазоне от микросекунд до миллисекунд. Стоимость вставки в древовидный элемент управления будет зависеть от таких вещей, как видимость и количество элементов в нем, но обычно она ближе к диапазону реестра, чем к рекурсии. Если вы собираетесь вставить много элементов в элемент управления, вы обычно хотите заблокировать элемент управления, чтобы он не обновлялся во время вставки, а затем снова включите обновление после завершения.
Во-вторых, да, это можно сделать без рекурсии. Обычный способ - иметь некоторый контейнер для хранения данных, которые необходимо будет обработать, например, очередь или стек. Когда вы идете по дереву реестра, вы извлекаете данные, и когда / если вы встретите «подкаталог» в дереве, вы помещаете его в стек. Когда вы заканчиваете работу с текущим «каталогом», вы извлекаете следующий из стека / очереди / чего угодно и обрабатываете его таким же образом. Когда коллекция пуста, все готово.