Understanding the working of Embedded Concurrent Assertions

Questions (1) and (2) are really the same issue. You have a race condition between the first two initial blocks. These blocks are running concurrently.

initial begin // forever unrolled
   #10 clk = !clk;
   #10 clk = !clk;
   #10 clk = !clk;
   ...
end

and

initial begin:I1
    #10 @(posedge clk); 
    $display("I1 done at time:%0t",$time);
end

If the first initial block resumes after the #10 before the second initial block resumes, you miss the first posedge of clk. If the order is reversed, the @(posedge clk)` catches for first posedge.

For question (3), The properties p1 and p2 look at sampled value of clk which are always 0 if you are also using clk as the cycle event.