Давайте еще раз обрисуем ситуацию. Вот описание CMyCllass:
class ATL_NO_VTABLE CMyClass : 
	public CComObjectRootEx<CComSingleThreadModel>,
	//public CComObjectRootEx<CComMultiThreadModel>,
	public CComCoClass<CMyClass &CLSID_MyClass>,
	public ISupportErrorInfo,
	public IConnectionPointContainerImpl<CMyClass>,
	public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_TRANSACLib>,
	public CProxy_IMyClassEvents< CMyClass >
{
public:
	CMyClass()
	{
	}
	IStream *str;
	static CMyClass *p;
	
	static void __stdcall Callback (long var);
	DECLARE_REGISTRY_RESOURCEID(IDR_MYCLASS)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMyClass)
	COM_INTERFACE_ENTRY(IMyClass
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(ISupportErrorInfo)
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
	COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
// ISupportsErrorInfo
	STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
public:
	STDMETHOD(SetCallback)(...);
....
public :
BEGIN_CONNECTION_POINT_MAP(CMyClass)
	CONNECTION_POINT_ENTRY(DIID__IMyClassEvents)
END_CONNECTION_POINT_MAP()
};
обратите внимание на наследование от CProxy_IMyClassEvents. Он отвечает за вызова рукотворных событий. Вот он
template <class T>
class CProxy_IMyClassEvents : public IConnectionPointImpl<T, &DIID__IMyClassEvents, CComDynamicUnkArray>
{
	//Warning this class may be recreated by the wizard.
public:
	HRESULT Fire_CallbackDone(VARIANT var)
	{
		CComVariant varResult;
		T* pT = static_cast<T*>(this);
		int nConnectionIndex;
		CComVariant* pvars = new CComVariant[1];
		int nConnections = m_vec.GetSize();
		
		for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
		{
			pT->Lock();
			CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
			pT->Unlock();
			IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
			if (pDispatch != NULL)
			{
				VariantClear(&varResult);
				pvars[0] = var;
				DISPPARAMS disp = { pvars, NULL, 1, 0 };
				HRESULT hres=pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
			}
		}
		delete[] pvars;
		return varResult.scode;
	
	}
};
Так вот как раз это метод я и вызываю из моего CallBack
void __stdcall CMyClass::Callback (long var){
CoInitialize(NULL);
    VARIANTARG var;
    var.lVal=var;
    var.vt=VT_I4;
    p->Fire_CallBackDone(var);
CoUninitialize();
}
1. Как я уже говорил, сначала была проблема с назначением calback в методе SetCallback. Извратился и сделал с помощью typedef и приведения адреса ф-ции к типу long.
2. Потом встала проблема с вызовом из callback метода отвечающего за событие. Это я сделал через статический указатель на сам класс CMyClass. Считаю это не совсем корректным для многопользовательского режима, но там посмотрим. Пока оставил так.
3. Далее спотыкания пошли на Fire_CallbackDone. Не хотелась выполняться строка 
HRESULT hres=pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
Если посмотреть на ф-цию Fire_CallbackDone, то виден цикл, который пробегает по всем членам  динамического массива IUnknown интерфейсов m_vec. Там хранятся точки в которых от нас ждут вызова события, например в VBA 
Dim withevents MyObj as test.MyClass
pub MyObj_CallbackDone()
end pub