You can use subquery factoring to replace a non-correlated subquery.
How on Earth do you propose doing so for a correlated subquery?
I don't understand part (b), can you rephrase?
Taking a guess at what you mean: a subquery in the WITH clause is typically executed only once before the main query is executed.
For large datasets, subquery factoring is obviously better since you're executing the subquery only once in most if not all cases. For smaller datasets the overhead of creating temporary tables may take longer than the actual query.
Apart from the performance concerns mentioned above, subquery factoring results in much cleaner and easer-to-maintain code.