Ошибаетесь. В первом случае будет два обращения - получение категории при вызове Category.objects.get(id=1) и получение её дочерних элементов при первом вызове cat.children.all(), а все последующие вызовы будут взяты из кэша ORM. Во втором select_related() будет проигнорирован, так как он используется для join'ов, а у вас children, скорее всего - записи из той же таблицы. select_related() помогает тогда, когда нужно считать данные двух связанных моделей одним запросом. Всё это очень просто и подробно
описано в документации.
Очень помогает просветлению просмотр сделанных sql-запросов после операций с queryset'ами:
from django.db import connection
print(connection.queries)
Позволяет понять и сколько их было сделано, и какие конкретно.