Ai tempi avevo un po' studiato le funzionalità di remoting del .NET, che, un po' alla maniera di DCOM, Corba e compagnia, consente di accedere ad oggetti situati nel processo server da un client, usando (ad esempio) i socket come layer di trasporto. Suppongo che WCF sia l'evoluzione di questa roba, che potresti usare per la comunicazione tra servizio e applicazione.
La scelta comunque dipende molto dal tradeoff performance/facilità d'uso che serve per il tuo programma - la memoria condivisa, ad esempio, è la cosa più veloce, ma se non sincronizzi in maniera corretta è un fiorire di race conditions e heisenbug; dall'altro lato, una soluzione tipo WCF dovrebbe rendere abbastanza trasparente il fatto che tu stia operando con oggetti che stanno in un altro processo, ma non credo che abbia performance analoghe.