1) Problem reproduced, don't know why this is not working, the parameters appear to be "read-only", maybe a bug:
var merge = new MergeCFA;
merge.sourceCFAImage0 = cfa0[0].mainView.id;
merge.sourceCFAImage1 = cfa1[0].mainView.id;
merge.sourceCFAImage2 = cfa2[0].mainView.id;
merge.sourceCFAImage3 = cfa3[0].mainView.id;
console.writeln("merge.sourceCFAImage0: ", merge.sourceCFAImage0); // returns empty string???
console.writeln("merge.sourceCFAImage1: ", merge.sourceCFAImage1); // returns empty string???
console.writeln("merge.sourceCFAImage2: ", merge.sourceCFAImage2); // returns empty string???
console.writeln("merge.sourceCFAImage3: ", merge.sourceCFAImage3); // returns empty string???
2) I believe no. I use console.writeln() and console.flush().
3) Some processes (eg PixelMath) let you set a newImageId. Others like NewImage and MergeCFA don't. For the latter, immediately after execution, you can try ImageWindow.activeWindow.mainView.image.
Regards,
Mike