Running on a Windows PC, running Windows 10, I went back several versions of JMP and ran your script, and it ran correctly on all versions.
Your second qualification, that sometimes you have missing values in your data should not be an issue. The Maximum() function handles missing values.
Not knowing more about your script, I will point out a possible issue. If you look at the formula that is created for the column max_col you will see:
The formula relies on the list "use_cols", so every time the formula is run, or rerun, it go to the list and uses the value "at that point in time" of "use_cols" and places it into the formula. If the value of "use_cols" is "{Name( "a@b;2" ), Name( "c@d;3" )}", everything will work fine. If for some reason, the list "use_cols" has changed it's value, the formula may not work and you will get missing values. What you really want is for the formula to be
Maximum( {:Name( "a@b;2" ), :Name( "c@d;3" )} )
The easiest way to do this, in my experience, is to specify the new column and formula as:
Eval(Parse("dt << new column(\!"max_col\!",numeric,formula( Maximum(" || char(use_cols) || ")));"));
It results in the formula being specified as:
Jim