My take on this, you should use option 2 whenever possible, but with a minor tweak if that leads to the same result. I would remove the call to .a() for the first element and have the loop start at index 0.
if (this.arr.length > 0)
{
this.arr[0].b();
}
for(int i=0;i<this.arr.length;i++){
this.arr[i].a();
}
If that changes the behavior, it might be possible to move the call to .b() for element 0, so it's after the for loop.
First of all, this makes your code easier to read. You clearly execute something on the first element of the array when that statement is not in a for loop for that array, because all the information that makes that clear is on one line of code. The 0 index and the execution of the method are on the same line.
If you'd use option 1, the information would be divided over two lines. The if statement would hold the information that you are looking to do something with the 0 index element and the execution of the method would be on a different line.
Also, the fact that you need an if statement in option 1, adds to the complexity of the code.
A secondary reason for this is performance. In your example, this is hardly a factor as you are only comparing an int variable with a constant, but I do want to include it here as the examples are easily extrapolated into much more complex scenario's, in which case performance could become a significant factor.
arr[0].b()is executed afterarr[0].a()? Is it really important thatarr[0].b()is executed beforearr[1].a()andarr[i].a()? If so in an OO approach I'd pass the index to a method on of the objects stored in the array and let them decide on their own.