From another thread, I got this solution to do a recursive selectinload:
child_select = selectinload(Parent.child)
for _ in range(<depth>):
child_select = child_select.selectinload(
child_select.nodes)
statement = select(Parent).filter(
Parent.id == parent_id).options(child_select)
result = await session.execute(statement)
parent = result.scalars().first()