Hey Mike,
Cool, glad you're liking wire!
This certainly sounds like an odd situation, but I understand that things like this come up when you start modifying an existing architecture to bring in something like wire. Typically, you'd simply want to rely on wire to inject the dep when the promise resolved, but that clearly won't work here. Wire is designed to hide init-time async drudgery :) and in basically every case, when it encounters a promise, it'll wait for it, as you saw :)
It does that for various reasons, one of which is to try to ensure correct initialization order of all components even in the face of asynchrony. Trying to "hide" a promise from wire is doable, but usually requires a little hoop-jumping, and can have some implications: since wire won't know about the promise, it can't consider that promise as part of it's automatic initialization ordering. So, your app code may have to deal with that.
One quick question: is your ultimate goal to inject the promise itself, or to inject the promise's fulfillment value? As you said, waiting for the promise to fulfill causes deadlock, but just trying to get a sense for the ultimate goal.
If you need to inject the promise, the simplest thing might be to pack the promise in a simple wrapper object, e.g.
return { promise: deferred.promise }
And then unpack it in the target code. That requires changing the code into which the dependency is injected, which is probably simple, but definitely not ideal. For example, you could use an init method instead of property injection for that particular dependency. Seems like we can do better ... hmmm ...
A wire plugin could certainly do it. If you need to do this in several places, that might be worthwhile, but if it's just this one spot, a wire plugin is probably overkill. I'll give it a bit more thought and try to post some more ideas soon.
P.S., if you're already using Q for promises, that's cool. Q is an excellent library, and since wire uses when.js internally, they'll all play nice together. You could opt, in the future, to reduce your dependency graph by using when.js in your app code as well, since it's already an implicit dependency for wire.