The theory about file lock was almost correct—I found that about five or six files had complete paths with more than 260 characters. One was in Code under Roaming from MS Code, and the other was random files in my Firefox profile. I deleted them and successfully reran the in-place upgrade!
I'm installing updates now, but several things that had stopped working are working (audio issues and notepad.exe missing, for example). I'm optimistic.
I think we can mark this one done! All updates are installed, and everything is working as expected so far. Thank you again for your help over the last three months!