what is the intended way to filter cyclic
org.osgi.framework.BundleContext.registerService(String, Object,
Dictionary) calls in an EventHook?

E.g. an Eventhook listens for "foo" services and upon services
registration creates a modified version of the original service and
registers it with the framework, again as a "foo" service. Obviously
this causes the hook to be notified by the framework again about the new
"foo" services.

Do I need to use marker properties to prevent the EventHook from running
into a cycle?

Marker properties could be used or you could set a thread local variable since the hook should be called synchronously. Then check the thread local variable to see if the Event is a result of the registration of foo by your hook.

Actually now that I think about it Thread local variables may not be the most framework agnostic way to do this. While the events must be fired to all the listeners before returning from registration I don't think the specification forces an implementation to do that all on the same thread as the service registering thread (Equinox uses the registering thread to dispatch the events to the listeners/hooks). So I would go with some service property in this case.

You need to handle this as a hook author. The hooks are very low level API and thus don't provide any filtering support. A marker service property is probably your best bet to identify services which are registered by your hook implementation.