As far as I know, at the moment there's no way to add a tag without using the menu. The fe.game_info entry are read only, and there's no way to change them directly.
A workaround (the one I use in my layout) would be to directly edit the tag files that are in the romlist folder of attract mode, adding or removing the games with the proper tag. That works, but it doesn't affect the current romlist unless you find a way to force a "to new list" transition so the romlist is refreshed internally.
My solution is pretty pervasive: I have a "proxy" romlist built at the beginning and use that for all my game info, so I can add fields to that romlist that don't exist in the real romlist. This is a deep change and requires a lot of code, but you could use a proxy romlist just for "Completed" tag management.
You could do something like this: build a table at the load of a list with the rom names as fields, and the "completed" switch data taken from a tag file (either the default completed tag file or a custom file in your layout folder). This would completely decouple your "completed" status checks with tags.
I know my explanation is a bit confused, sorry, but this is the obscure territory where you add features to Attract Mode that are not even present in the main software
