Assumed, that it's by design. New record in DB == new AR object to ensure all behaviors work out as expected. AR::setIsNewRecord(true) used here looks like dirty hack. Why not change code to:
foreach($pks as $N=>$id)
What reason to do like you shown? If the goal is speed, use DAO. With DAO you can generate more effective SQL using massive INSERT syntax:
INSERT INTO table(c1,c2,c3) VALUES(v1,v2,v3),(v4,v5,v6),(v7,v8,v9),...,(vx,vy,vz);
CActiveRecord anyway did not do this for you, if it's natural "active record pattern
" by design.
No good, no bad, only consequence.