Here's a function that I believe does what you want. Tested with JMP 19.04. It breaks without the Eval( Eval Expr()).
arrange_columns = Function( {dt},
num_columns = dt << Get Column Names( Numeric, String );
char_columns = dt << Get Column Names( Character, String );
ex_columns = dt << Get Column Names( Expression, String );
rs_columns = dt << Get Column Names( RowState, String );
dt << Reorder By Data Type();
For Each( {group, index}, {num_columns, char_columns, ex_columns, rs_columns},
If( N Items( group ) > 1,
Eval( Eval Expr( dt << Move Selected Columns( Expr( group[2 :: N Items( group )] ), After( group[1] ) ) ) )
)
);
);