I can see the problem and you're right, there's no clear right thing for AndFn to do in its cleanup method. But on the other hand I'm not sure it's relevant. The main problem for me is if you allow users to override methods, but then silently fail to run their code under certain cases.
I think these two lines should be functionally equivalent:
PCollection<?> filtered1 = collection.filter(fnA).filter(fnB);
PCollection<?> filtered2 = collection.filter(FilterFns.and(fnA, fnB));
But, without a delegating call to cleanup in AndFn, depending on what I'd put in my cleanup overrides, I might get different results.
How about an unconditional call to cleanup on all the child FilterFns, regardless of whether they were a part of an And, Or or Not. If the user decides to emit a ton of stuff in cleanup which violates the filter logic, then that may be bad form but surely that's their decision?