Not sure if this is acceptable, but I tested and "it works on my mac".
in CCParticleSystem.h
// experimental
typedef void (^onCompletedBlock)();
@property (readwrite, copy) onCompletedBlock onComplete;
in CCParticleSystem.m
@synthesize onComplete;
in the same file update method, 
_particleCount--;
        if( _particleCount == 0 && self.onComplete)
        {
            [self onComplete]();
            [[self onComplete] release];
        }
if( _particleCount == 0 && _autoRemoveOnFinish ) {
            [self unscheduleUpdate];
            [_parent removeChild:self cleanup:YES];
            return;
}
In your code
particleSystem.autoRemoveOnFinish = YES;
particleSystem.position = ccp(screenSize.width/2, screenSize.height/4);
particleSystem.onComplete = ^
{
    NSLog(@"completed ..");
};
again, quite experimental..