For each declaration of the where clause in the loop, there is a separate Func<int, bool> instance that is being passed into it. Since the value of i is being passed to the lambda function associated with each instance of Func<int, bool> (Func<int, bool> being essentially a delegate), i is a captured variable that is shared amongst each instance of Func<int, bool>.
In other words, i must be "kept alive", even outside the scope of the loop, in order for its value to be evaluated whenever any instance of Func<int, bool> is invoked. Normally, this wouldn't be a problem except that the invocation will not occur until it is necessary (i.e. there is need to enumerate through the results of the query that the delegate instance is passed to. An example would be a foreach loop: only then would the delegate be invoked in order to determine the results of the query for the purposes of the iteration).
This means that the LINQ queries declared in the loop won't really be made until some time after the conclusion of the for loop, meaning that i would be set to the value of 2. As a result, you are actually doing something like this:
b.Add(someData.Where(n => n == 2));
b.Add(someData.Where(n => n == 2));
To prevent this from happening, for each iteration in the loop, you need to declare a separate instance of the integer type and make it equivalent to i. Pass this to the lambda function declared in the iteration and each instance of Func<int, bool> will have a separate captured variable whose value will not be modified after each subsequent iteration. For example:
for (int i = 1; i <= 2; ++i)
{
int j = i;
b.Add(someData.Where(n => n == j));
}