Hi Martin,
I think with r39578 you want to prevent that topo, cidx and sidx is written for a vector not in the current mapset, right? That makes perfect sense. But if a vector is opened in update mode, the files coor, hist, dbln, and head are also modified, not so when opened in read only mode with Vect_open_old(). I think this update mode mainly targets the coor file which is the most important file of a grass vector. You can get a working vector after deleting and manually restoring all files but the coor file. This one is the most precious one so to speak, and I would modify the coor file only if really necessary. Therefore I would suggest to open vectors in v.build with Vect_open_old(), but first make sure that the vector is in the current mapset as is done in Vect__open_old() with update requested. I know this is a bit against current standard because it should be done by libraries only, but in this case I would make an exception. What do you think?
Best,
Markus