Holas,
 
Después de investigar un rato encontré una solución, requiere de dos pasos: 1 función recursiva para obtener las estructuras y una consulta CTE para obtener la cantidad de personas. 
Queda así:    
Código SQL:
Ver originalALTER FUNCTION [dbo].[udf_recorreEstructura](
    @pm_est_org_id INT
)
RETURNS @tmpEstOrg TABLE ( 
    est_org_id INTEGER
    , est_org_id_padre INTEGER NULL
    , niv_org_nivel VARCHAR(150)
    , niv_org_nombre VARCHAR(100)
    , reg_id INTEGER NULL
    , ciu_id INTEGER NULL
    , com_id INTEGER NULL
    , est_org_nombre VARCHAR(100)
    , est_org_descripcion VARCHAR(200) NULL 
    , est_org_fec_creacion datetime NULL
    , est_org_activa bit NULL
)   
AS
BEGIN
    --primero verificamos que venga un entero valido
    IF (isnumeric(@pm_est_org_id)=1 AND @pm_est_org_id>0)
    BEGIN
        DECLARE @id_estructura INTEGER;
        SET @id_estructura = CONVERT(INTEGER, @pm_est_org_id);
        
        IF (@id_estructura>0)
        BEGIN
            INSERT INTO @tmpEstOrg (
                est_org_id, est_org_id_padre, niv_org_nivel, niv_org_nombre, reg_id, ciu_id, com_id
                , est_org_nombre, est_org_descripcion, est_org_fec_creacion, est_org_activa
            ) SELECT eo.est_org_id, eo.est_org_id_padre, eo.niv_org_nivel, niv.niv_org_nombre
            , eo.reg_id, eo.ciu_id, eo.com_id
            , eo.est_org_nombre, eo.est_org_descripcion, eo.est_org_fec_creacion, eo.est_org_activa
            FROM tbl_estructura_organizativa eo
            LEFT JOIN tbl_nivel_organizativo niv ON niv.niv_org_nivel=eo.niv_org_nivel
            WHERE est_org_id_padre=@id_estructura;
            
            INSERT INTO @tmpEstOrg (
                est_org_id, est_org_id_padre, niv_org_nivel, niv_org_nombre, reg_id, ciu_id, com_id
                , est_org_nombre, est_org_descripcion, est_org_fec_creacion, est_org_activa
            ) SELECT f.est_org_id, f.est_org_id_padre, f.niv_org_nivel, f.niv_org_nombre
            , f.reg_id, f.ciu_id, f.com_id
            , f.est_org_nombre, f.est_org_descripcion, f.est_org_fec_creacion, f.est_org_activa
            FROM @tmpEstOrg t
            CROSS APPLY dbo.udf_recorreEstructura(t.est_org_id) f
        END
    END
    RETURN
END
  
  
Y luego la consulta CTE    
Código SQL:
Ver originalWITH 
cteEstructura (
    est_org_id, est_org_nombre
) AS (
    SELECT est_org_id, est_org_nombre
    FROM tbl_estructura_organizativa
    WHERE est_org_id_padre=0
    OR est_org_id_padre IS NULL
),
cteInscritos (
    est_org_id, inscritos
) AS (
    SELECT e.est_org_id, COUNT(p.rut_persona) AS total
    FROM cteEstructura e
    CROSS APPLY dbo.udf_recorreEstructura(e.est_org_id) f 
    INNER JOIN tbl_persona p ON p.est_org_id=f.est_org_id
    GROUP BY e.est_org_id
)
SELECT e.est_org_nombre, SUM(i.inscritos) AS inscritos
FROM cteEstructura e
INNER JOIN cteInscritos i ON i.est_org_id=e.est_org_id
GROUP BY e.est_org_nombre
ORDER BY inscritos DESC
  
Por ahora es la solución que he encontrado y funciona bien, aún creo que existen un par de detalles que pulir y estaré trabajando en ellos. 
Agradezco la ayuda al respecto. 
Saludos