A solution that comes to mind could be to spend the UTOs on both chains at (nearly) the same time with high enough fees to ensure that both transactions
are mined as soon as possible.
Correct.
Once both have confirmed, they will be two separate UTXO and it will no longer be possible to replay a transaction spending one of them on one chain to the other chain.
Questions:
Is this attack just in the domain of theory, or has it happened before?
It is a very easy attack to accomplish if replay protection is not available in forked code. I don't know if there have been any forks without built in replay protection yet. If there have, I don't know if anyone has tried the attack yet.
If the fork is friendly, should there be a mechanism in place to protect users against replay attacks,
Even if the fork is NOT friendly, there should be a mechanism in place. For the protection of your own chain and users.
or in other words,
is there a way to implement Replay Protection globally?
When a fork is created, the code can modify the transaction validation process such that transactions from the other fork are invalid. In that way, transactions won't be able to be replayed from one fork to the other.
How can this be done properly and whose responsibility is it to implement it (the people in charge for the fork)?
It is the responsibility of the users to be aware of what their software does and decide whether it protects them adequately.