Two issues.
1) You %PUT is before you call the macro that would create NOW.
2) Unless you have created the macro variable NOW before you call the macro then the macro variable NOW it creates will be LOCAL to the macro and no longer exist when the macro finishes.
You can either define the macro variable before calling the macro:
%let now=;
%x2n(5,pablo,23);
%put NOTE- Bienvenido son las &now;
Or change the macro to make sure it doesn't define NOW as logic. The quick (and dirty) method is to use the optional third argument to CALL SYMPUTX(). NOTE: unless there is some strange reason that you need the macro variable to have leading and/or trailing spaces you should never use the ancient CALL SYMPUT() method.
%macro X2N(id,nombre,edad);
title "Bienvenido %upcase(&nombre), hoy es &sysdate9.";
data _null_;
call symputX('now',put(time(),time5.),'g');
run;
proc print data=y;
run;
%mend X2N;
NOTE: If you want NOW to include leading zero when time() is before 10AM then use TOD format instead of TIME format.
But the better solution would be to only define NOW as GLOBAL when it does not already exist. Then you could call this macro from another macro that has a LOCAL macro variable named NOW and be able to see the results.
%macro X2N(id,nombre,edad);
%if not %symexist(now) %then %global now;
title "Bienvenido %upcase(&nombre), hoy es &sysdate9.";
data _null_;
call symputX('now',put(time(),time5.));
run;
proc print data=y;
run;
%mend X2N;