Are you concerned about circular references or circular dependencies? Circular references (a run time issue) are very difficult to avoid when using the observer pattern. Circular dependencies (a design time issue) can always be got rid of.
Typical usage of the observer pattern in c# is for the observer have a reference to a publisher object and to register itself with the event using something like:
publisherObject.SomeEvent += MyEventHandler();
So the observer already has a reference to the publisherObject and what happens in the background is that publisherObject gets sent (and stores) a reference to the observer's event handler. So unless you are going to drop the reference to publisherObject immediately, you're stuck with a circular reference.
This is normally only a problem when you want the garbage collector to tidy up unused objects. The "hidden" reference to the observer's event handler inside publisherObject is enough to prevent the observer being garbage collected. This is sometimes referred to as the lapsed listener problem. Easiest way round it is to put event unsubscriptions in the observer's Dispose() method (and remember to call it when you get rid of the observer).
You can get round this, but it generally adds quite a lot of complexity that may not be warranted in a smallish app. Previous posters have already suggested the EventBroker, MEF and dependency injection routes.
If you're more concerned about circular dependencies, then the simplest answer is a strict parent-child hierarchy as Quarrelsome suggested. The parent (observer) always knows about its children so can call properties and methods on them directly if it needs to. The children (publishers) should know nothing about their parent. They communicate upwards purely via events and function return values. Communication between children is then routed via a common parent (events on the way up, method calls on the way down).
Note that you've still got circular references due to the way the event mechanism works (so be careful about disposing) but you don't have circular dependencies. The child can even be in completely different assembly that doesn't have a design time reference the one containing the parent.
Note that you can be a bit flexible about what you consider the parent and what the child. Just because your main form creates a sub form doesn't mean you have to define the parent-child communications in that direction. A typical plug-in style architecture may have the main form creating instances of the plugins. But once created, the communications will probably treat the plugin as the parent/observer and the main form as the publisher/event source.