Claude sorted it for me. Instead of storing interface objects and directly calling methods on them, “Forwarder” objects are instantiated and stored for each target object. Each Forwarder has a WeakRef to the target and its own method with the required signature, which in turn calls the interface method on the target:
Public Sub HandleNotification(EventType As String, Details As Variant)
If Target <> Nil And Target.Value <> Nil Then
EventHandlerIJ(Target.Value).HandleNotification(EventType, Details)
End
End Sub
AddressOf can now be called on the HandleNotification method of the Forwarder object, so it works with the MBS method:
Dim fwd As NotificationForwarder = HandlersArray(HandlerIndex)
If fwd.Target.Value <> Nil Then
CallDelegateOnMainThreadMBS AddressOf fwd.HandleNotification, EventType, Details
End If