MERGE-READTABLES-INTO function makes the somewhat unportable assumption that a dispatching macro character's function as returned by GET-MACRO-CHARACTER (without sub-char) is always EQ to the function obtained for *any* dispatching macro character. (I do see the special-cased cruft for CLISP which attempts to detect function equality by name and/or s-expression)

The single "meta-dispatch" function for dispatch macros is only one of several possible implementation techniques and indeed this was the case in SBCL prior to the second of my two changes - the patch which corrected the inability to clear dispatch tables.
I made a dispatch macro function into a closure over the sub-table, and so functional equality is a weird thing to ask for.

I suspect what you should do is *not* call CHECK-READER-MACRO-CONFLICT for the dispatching character itself.  The loop over sub-characters already enforces no conflict on each sub-char.  But I think it also makes sense to add an enforcement that a dispatching char in the from-readtable is either already a dispatching char in the target readtable, or not a macro at all (yet), in which case it will become a dispatching macro. Enforce the check for non-dispatching characters, probably just by moving the enforcement into the branch of the cond that deals with non-dispatching.

Also I think it makes sense that we add one slot into a readtable for its NAME and provide (and document) an accessor for it.
This eliminates the hashtable that maps readtables to their names, which unless I'm misreading, leads to unreclaimable pointers.

I'll try to come up with something but you're probably better able than I given the above problem description.