First, write your code in structured way that lets you see logical blocks; as it is, that ugly spaghetti is close to un-decipherable. See Maxim 12.
Next, use %put to follow your macro logic:
%macro central_bank (reg, begin, end);
%do i = &begin. %to &end.;
%put loop iteration for &i.;
%if &begin.= 28 or &begin.= 29 %then %do;
%put branch for begin in (28,29);
%end;
%else %if &begin.= 30 or &begin.= 31 %then %do;
%put branch for begin in (30,31);
%end;
%end;
%mend central_bank;
%central_bank (US, 28, 31);
The log from that (see Maxim 2) tells you that your second %if prevents the second block from executing:
37 %macro central_bank (reg, begin, end);
38
39 %do i = &begin. %to &end.;
40
41 %put loop iteration for &i.;
42
43
44 %if &begin.= 28 or &begin.= 29 %then %do;
45
46 %put branch for begin in (28,29);
47
48 %end;
49
50 %else %if &begin.= 30 or &begin.= 31 %then %do;
51
52 %put branch for begin in (30,31);
53
54 %end;
55
56 %end;
2 Das SAS System 07:58 Wednesday, February 13, 2019
57
58 %mend central_bank;
59
60 %central_bank (US, 28, 31);
loop iteration for 28
branch for begin in (28,29)
loop iteration for 29
branch for begin in (28,29)
loop iteration for 30
branch for begin in (28,29)
loop iteration for 31
branch for begin in (28,29)