Il problema sembra essere nello scopo delle variabili/nomequery della funzione, ( non mi è molto chiaro come mai se la funzione si chiama allo stesso modo le variabili interagiscano tra loro...)
comunque questa potrebbe essere una soluzione:
ho creato la seguente tabella "pippo" ( se ho ben capito è la tua struttura, io uso oracle ma di fatto non cambia null)
IDPADRE IDFIGLIO
1 100
100 1000
100 1100
1000 10000
1000 10001
1 200
questa la funzione (ho usato i tag perchè mi trovo meglio)
<cffunction name="fn_pippo" returntype="any" output="true" >
<cfargument name="pk" type="any" default="-1">
<cfoutput>
figli di #pk# </cfoutput>
<cfquery name=#iif(1 eq 1 ,DE("sel" & pk),de(" "))# datasource="pluto">
select * from pippo where
idpadre = <cfqueryparam cfsqltype="cf_sql_numeric" value="#pk#">
order by idfiglio
</cfquery>
<cfif #Evaluate("sel#pk#.recordcount")# gt 0 >
<cfloop query=#iif(1 eq 1 ,DE("sel" & pk) , de(" "))#>
<cfoutput>
#Evaluate("sel#pk#.idfiglio")# ----</cfoutput>
<cfset aa = #fn_pippo(Evaluate("sel#pk#.idfiglio"))#>
</cfloop>
<cfelse>
<cfoutput>
no figli</cfoutput>
</cfif>
<cfreturn "ok">
</cffunction>
quando la lancio con
<cfset zz = fn_pippo(1) >
ottengo
figli di 1
100
figli di 100
1000
figli di 1000
10000
figli di 10000
no figli
10001
figli di 10001
no figli
1100
figli di 1100
no figli
200
figli di 200
no figli