Yep, I've seen that too. Don't know of any way to delete them. Unions seem to be lower-class objects, in that they can't be selected or edited or queried (aside from InUnion(number) only).
Possibly there are more hooks via scripting interface. If not, I guess the only solution would be to edit the PcbDoc directly -- reverse-engineer the format, find where unions are enumerated, delete the empty ones, then repack the file so all headers and offsets are still valid.
Possibly we can convince Altium to address it as a bug, if we find a way to crash it. Can we produce enough empty unions to cause faulty behavior (maybe corrupting other unions, or making a ridiculously oversized file, or outright crashing the program)?
Tim