Если вы хотите отделить свои абстракции от их реализаций (всегда достойная цель), вы должны определить эти абстракции в их собственной сборке.
Со стороны реализации с этим легко справиться, потому что вам нужно ссылаться на абстракции для их реализации. Нет никакого способа обойти это независимо от того, используете ли вы MEF или нет, так что это всегда было так:
[Import(typeof(IFoo))]
public class MyFoo : IFoo { }
Однако, как вы говорите, это означает, что вы не можете ссылаться на Composition Root из библиотеки абстракций. Однако так и должно быть, потому что абстракции не должны беспокоиться о том, как они составляются.
Другими словами, вы должны реализовать композицию зависимостей вне библиотеки абстракций. Хорошим кандидатом для этого является сам исполняемый файл, тогда как все ваши конкретные реализации хранятся в одной или отдельных библиотеках.
Библиотека абстракций не будет иметь ссылок, в то время как потребители и разработчики должны будут ссылаться на нее, поэтому граф зависимостей может выглядеть следующим образом:
Composition Root --> Abstractions <-- Implementations
Где стрелки обозначают ссылку.