ovviamente prestando attenzione alle problematiche del multi-thread cioè stando attenti a non accedere mai contemporaneamente a risorse condivise.
in lettura il problema non si pone, in scrittura si, è buona abitudine usare oggetti lock o semafori (mutex) per gestire le risorse condivise (e usare la parola chiava "volatile" in tali variabili)

In teoria qualsiasi oggetto istanziato in un thread è accessibile dagli altri visto che l'area di memoria è condivisa, giusto?
se intendi dire che nel corpo del thread (dowork) qualsiasi thread accede alle variabili (locali) create da qualsiasi altro thread allora no.. chiarisci questo punto.

2) Quando un thread lancia un evento in pratica è come richiamare un delegate cioè un puntatore a funzione: il thread che lancia l'evento salterà dal flusso di istruzioni in cui si trova a quello della funzione che gestisce l'evento e una volta finito riprenderà l'esecuzione del flusso dalla riga successiva a quella che ha scatenato l'evento. Il meccanismo non è quindi asincrono bensì sincrono. Corretto? Inoltre la chiamata dell'evento, e quindi la chiamata della funzione che lo gestisce, comporterà il caricamento nello stack del thread in questione di una copia delle istruzioni da eseguire per cui nel caso in questione avremo potenzialmente N stack (relativi agli N thread) in cui contemporaneamente vi sarà caricata una copia della funzione LogManagement(). Siete d'accordo?
corretto.. per averlo asincrono esistono altri metodi..

3) A questo punto l'aspetto delicato sarà gestire eventuali accessi da parte di tutte queste repliche parallele del LogManagement() a membri di OBJ2 (che saranno condivisi in quanto l'oggetto è uno solo) o ad esempio ad un file TXT dove si va a scrivere. Siete d'accordo?
esistono apposta i blocchi "lock" e i semafori (mutex) per fare ciò


Alla luce di queste considerazioni sarei portato a chiedermi che differenza ci sarebbe se invece che usare gli eventi io passassi ad ogni costruttore di OBJ1 (dal thread principale) il puntatore all'oggetto OBJ2 e potessi quindi poi richiamare da ogni thread secondario il metodo LogManagement() direttamente.
tecnicamente non cambia molto, la gestione ad eventi ti semplifica solamente le cose (in questo caso) e ti permette di sapere sempre chi è il thread che ha eseguito la funzione