Yes, and If I was an astronaut. . . 
Of course knowing all this information would be ideal, but i think there is a simpler solution.
What if filtered messages were to reach the aggregator as well, but augmented with some header information tellig you that they are filtered. For example:
Code:
<int:splitter . . . output-channel="filterChannel"/>
<int:filter input-channel="filterChannel" output-channel="aggregatorChannel" discard-channel="transformingChannel". . ./>
<int:header-enricher inputChannel="transformingChannel" output-channel="aggregatorChannel">
<int:header name="filtered" value="true"/>
<int:header-enricher>
<int:aggregator input-channel="aggregatorChannel". . .>
<bean class="foo.bar.MyAggregator"/>
<int:aggregator>
public class MyAggregator {
public List<Message> aggregate(List<Message> messages){
// the input list would contain all messages and al you eed to do is filter out the once that were filtered
}
The main points are:
1. All messages reach the aggregator. This way you can rely on its default Release and Correlation strategy (less code for you)
2. Messages that passed the initial filter will go on to some process which may be long and complex while discarded messages go straight to the aggregator and wait for the other to arrive thus completing the sequence
3. The only work you need to do is implement the MyAggregator which will probably be only a few lines of code to remove messages that are marked as 'filtered' from it.