Since it's generally a bad idea to run updates this big on a live database, I suggest you break down your big update.
Here is not the most optimized way to do it, but i'm sure you'll manage to optimize it yourself.
Run in loop:
SELECT Id, ColA FROM TableA ORDER BY Id DESC LIMIT 10 OFFSET (iteration)*10
- Second loop, take rows from previous result where
tableA.colA=Y
2.1.SELECT Id FROM TableB WHERE ID=id_from_current_iteration
2.2.SELECT Id FROM TableC WHERE ID=id_from_current_iteration
2.3 If both previous queries returned null go to the next step, otherwise proceed to the next iteration 2.4UPDATE TableA SET ColA=X WHERE ID=id_from_current_iteration
In other words - avoid joins.
This will take longer than a single update, but it will work.
First step to optimize it will be batching queries.