If you can accept needing to use your own function then
In[1]:= mydist[expr_] := Distribute[expr] //. Dot[Times[a_, A_], Times[c_, C_]] -> a*c*A.C;
mydist[(a*A + b*B).(c*C + d*D)]
Out[2]= a c A.C + a d A.D + b c B.C + b d B.D
Please test that carefully before you depend on it.
UnProtecting and redefining Distribute to do this automatically might be feasible, but only if you want to risk that.