If I strip your 146 kbytes of nearly identical code down to the few lines that differ I get
"Works"
In[1]:= sub[1]=eDzstar.topmat;sub[2]=eDzstar.eDz1.topmat;sub[3]=eDzstar.eDz1.eDz1.topmat;
In[3]:= {sub[1],sub[2],sub[3]}
Out[3]= {eDzstar.topmat,eDzstar.eDz1.topmat,eDzstar.eDz1.eDz1.topmat}
(*Now kill the kernel and begin fresh*)
"Doesn't Work"
In[1]:= reps={eDzstar-> eDz1,eEzstar-> eEz1};
sub[r_Integer?(4>#>1||#>= 14&)]:= eDzstar.(Distribute/@(sub[r-1]/.reps));
sub[r_Integer?(14>#>= 4&)]:= eEzstar.(Distribute/@(sub[r-1]/.reps));
sub[1]=eDzstar.topmat;sub[2];sub[3];
In[4]:= {sub[1],sub[2],sub[3]}
Out[4]= {eDzstar.topmat,eDzstar.eDz1.topmat,eDzstar.eDz1.eDz1.topmat}
Can you more clearly point out with just these ten lines of code what isn't working?
The way you write some of your code makes it very difficult for me to understand what you are trying to accomplish and why you are doing things the way you do.
For example, why are you using Distribute? Is there some essential reason you are using that or did you just think that might have something to do with what you really want?
Next, if you have one version that works then why are you producing another more complicated and difficult to understand version just to have it not work?
I'm just guessing here, but is this anything like what you are really actually trying to accomplish?
sub[r_Integer?(4>#>=1||#>=14&)]:= Dot[eDzstar,Sequence@@Table[dEz1,{r-1}],topmat];
sub[r_Integer?(14>#>=4&)]:= Dot[eEzstar,Sequence@@Table[eEz1,{r-1}],topmat];
Does that work?