The Fortran standard says that VALUE, by itself, passes a writeable copy by reference. If the procedure declaration includes BIND(C), then it does mean pass-by-value. Earlier versions of Intel Fortran didn't get this right, treating VALUE as always meaning pass-by-value. I think it was version 16 that changed this. /assume:nostd_value reverts to the old behavior.
I haven't quite sorted out all you wrote, but I note that the abstract interface ProgressCallback2 doesn't include BIND(C).
If this doesn't help, please attach a small but complete test case that demonstrates the problem.
Quick question to the OP --- did you (or your company) report the ICE in your sources? That way, we can fix it and you'll be able to move on if necessary.