Does this do anything for your speed?
(defun c:matchxrnametofilename (/ blk path elst xname bname)
(while (setq blk (tblnext "block" (not blk)))
(and
(setq path (cdr (assoc 1 blk))) ; has a path
(setq xname (strcase (vl-filename-base path) t))
(setq elst (entget (tblobjname "block" (setq bname (cdr(assoc 2 blk))))))
(setq elst (entget (cdr (assoc 330 elst))))
(/= xname (strcase bname t))
(entmod (subst (cons 2 xname) (cons 2 bname) elst))
)
)
(princ)
)