I am surprised that the looping script was faster. I would have expected the opposite result.
I can think of several issues to explore:
The record was not part of the found set when the looping script looped through the records. This might a be due to wrong find criteria or due to a damaged field index producing a different found set than expected.
Some defect in your script is skipping records--that could be why it is faster.
If this is a hosted file, both Replace Field Contents and your looping script are vulnerable to edit locks keeping a record from being modified. If you looping script uses set error capture to supress error messages, you might not get any indication that another user had a record open for editing at the moment that you ran this update script.