By design.
In VFP, if a variable is created but not declared, its scope is PRIVATE, which means that any program called from where the PRIVATE variable is created can see and modify this PRIVATE variable.
In each of your procedures, declare i LOCAL, like this
PROCEDURE parent_loop
<b>LOCAL i</b>
for i=1 to aval
stuff
=my_funct()
endfor
PROCEDURE my_funct
<b>LOCAL i</b>
for i=1 to anotherval
do stuff
endfor
Insanity: Doing the same thing over and over and expecting different results.