That explanation is more about WHAT the macro is doing. Looking at the code it appears that the macro will calculate begin and end days for multiple months relative to a given base date (stored in the macro variable MONTH). But you are counting days since 1993 instead of days since 1960 like SAS does.
To get a better solution you really should explain WHY you want these new macro variables. And why do you need to generate so many at once.
You can certainly simplify your code. There is no need to use the MDY function to generate a constant date, just use a date literal instead. There is no need to use the %SYSFUNC() to call the SUM() function to add numbers. The %SYSEVALF() function will let you do arithmetic on macro expressions.
There are also some question to the parameters to the macro. Why is the base date value stored in a global macro variable instead of being passed as a parameter to the macro? Why is the macro parameter SEVERAL only being used to count how many values to generate? If that is all you need then why not just pass in N as the macro parameter? If you did want to pass a list of offsets then why not use them?
So here is a version of your macro that makes the above simplifications, but also adds another parameter to let the user pass in the base date if they don't want to use the macro variable MONTH as the basedate.
%let month = 9099;
%macro Loop(several,baseday);
%local i dt;
%if not %length(&baseday) %then %let baseday=&month ;
%let dt=%sysfunc(putn(&baseday+'01JAN1993'd,date9));
%do i=1 %to %sysfunc(countw(&several));
%global month_&i._f month_&i._l ;
%let month_&i._F = %sysevalf(%SYSFUNC(INTNX(month,&baseday+'01JAN1993'd,1-&i,B))-'01JAN1993'd);
%let month_&i._L = %sysevalf(%SYSFUNC(INTNX(month,&baseday+'01JAN1993'd,1-&i,E))-'01JAN1993'd);
%put &=baseday &=dt &=i month_&i._F=&&month_&i._F month_&i._L=&&month_&i._L ;
%end;
%mend;
So if we try it with your example value of 2 months of output and a base day values of 9099 this is what we get.
549 %Loop(1 2);
BASEDAY=9099 DT=30NOV2017 I=1 month_1_F=9070 month_1_L=9099
BASEDAY=9099 DT=30NOV2017 I=2 month_2_F=9039 month_2_L=9069
So if looks like your example base date of 9,099 corresponds to the last day of November 2017. So if we try it with a base date just a few days earlier is should generate the same macro variables, but if it is even one day later (9,100) then we should see the generated macro variables values move forward by a month. Also since if is not using the value of SEVERAL it doesn't matter if it contains numbers, just how many words it contains.
550 %Loop(A B,baseday=9095);
BASEDAY=9095 DT=26NOV2017 I=1 month_1_F=9070 month_1_L=9099
BASEDAY=9095 DT=26NOV2017 I=2 month_2_F=9039 month_2_L=9069
551 %loop(X1 X2,baseday=9100);
BASEDAY=9100 DT=01DEC2017 I=1 month_1_F=9100 month_1_L=9130
BASEDAY=9100 DT=01DEC2017 I=2 month_2_F=9070 month_2_L=9099
... View more