Iterating over (a,b) setting $var1 to each, $var1 is 'b' at the second iteration. @arr1 only contains (a).
How does 'b' match 'a' ? It doesn't. First, 'a' is true, so 'a' from @arr1 is returned; next 'b' is true, so 'a' from @arr1 is returned. There is no match; grep doesn't implicitly wrap its first argument into a m// operator.