There is no need to use CATxx() function in macro code. Macro code is just text substitution! So just put the text where you want it to appear.
%let a = %substr(&a.,1,4)01;
And to make things worse the %SYSFUNC() macro function does not play that well with SAS functions that allow either numeric or character values for some of their arguments. Like the CATxxx() function do. This is because everything is a text to the macro processor, but the SAS functions want to know whether they are being given a number or a string. When you call them in a data step they know what you are giving them. So %SYSFUNC() tries to GUESS whether the text in your macro call should be considered a number or a string. The text 01 looks like a number. And there is no different between the numbers 1 and 01 and 00001 they all mean the same number. So CATT() says, thanks I'll convert the number 1 into a string and concatenate it to the other arguments. And poof their goes your 0 digit.
... View more