I think either method would work for you. But in your case, where you know exactly what the strings are and what you want to change them to, I would use Munger, since it is a simple find and replace. I use Substr when I'm trying to find a specific string within a general string, and I don't know what the general string is or if my substring will even exist within it.
If I understand your problem correctly (and I'm not convinced I do) here is the JSL for making the changes as you described:
col = column("Att1_Stat1");
colName = col << getName();
colName = munger(colName, 1, "Att1", :Description[1]);
colName = munger(colName, 1, "Stat1", :Description2[1]);
col << SetName(colName);
col = column("Att1_Stat2");
colName = col << getName();
colName = munger(colName, 1, "Att1", :Description[1]);
colName = munger(colName, 1, "Stat2", :Description2[2]);
col << SetName(colName);
col = column("Att2_Stat1");
colName = col << getName();
colName = munger(colName, 1, "Att2", :Description[2]);
colName = munger(colName, 1, "Stat1", :Description2[1]);
col << SetName(colName);
col = column("Att2_Stat2");
colName = col << getName();
colName = munger(colName, 1, "Att2", :Description[2]);
colName = munger(colName, 1, "Stat2", :Description2[2]);
col << SetName(colName);
Hope this helps!