Sure, this is technically possible within one channel, but you'd have to be willing to cache messages in memory so you can send it all consolidated at the end.
In your deploy script, initialize a map:
if (!globalChannelMap.containsKey('csvMap')) {
$gc('csvMap', Maps.map());
}
In your preprocessor, add each message to a consolidated CSV (essentially un-batching your batch message):
var csvMap = $('csvMap');
var batchId = $('batchId');
if ($('batchSequenceId') == 1) {
csvMap.put(batchId, new java.lang.String(message));
} else {
csvMap.put(batchId, csvMap.get(batchId).concat(message));
}
return message;
Then on your SMTP Sender destination, add a filter rule so it only triggers when the last message in a batch is processing:

On the same destination, add a transformer step that pulls the consolidated CSV out of the global channel map and sets the transformed data to it:
msg = SerializerFactory.getSerializer('DELIMITED').toXML($('csvMap').remove($('batchId')));
And there you go. Your channel will continue to process one row at a time, but when it's processing the last row in a batch, it will also trigger this other destination. I'll attach the channel (exported from 3.5.0) for illustration: Example - Consolidate CSV.xml
Of course, another perhaps saner way to do this would be to split it up into two channels. The upstream channel does not do any batching, but sends to your downstream channel as well as sending that e-mail. The downstream channel would have batching enabled, and that's where you'd move your Web Service Sender.