You are just making the code more confusing by placing macro definitions inside of each other. There is just a single name space for macros. But every macro does create its own name space (scope) for macro variables. If you don't define a macro variable as LOCAL to the macro and there already exists a macro variable in an outer scope then it will be used. So when control returns from macro three the value of I is now larger than the upper limit of the do loop in the macro one.
%MACRO My_Macro_3;
%local i;
%do i = 1 %to 47;
.....
%end;
%MEND My_Macro_3;
%MACRO My_Macro_1;
%local i;
%do i = 1 %to 2;
... %My_Macro_2(&Para1.);
.....
%My_Macro_3;
%end;
%MEND My_Macro_1;
%My_Macro_1;
... View more