Formula fields are inherently read-only. As you found, you cannot write to them.
SObject.recalculateFormulas()
doesn't recalculate cross-object formulas. From the documentation:
This method doesn’t recalculate cross-object formulas. If you call this method on objects that have both cross-object and non-cross-object formula fields, only the non-cross-object formula fields are recalculated.
You're probably going to need to recalculate the value in Apex yourself to present it to the user before saving. Without more information about the requirements and what UI you need to present this in, it's not possible to give guidance.
SObject.recalculateFormulas()
is apparently not a good solution for you?