If the objects in the array are mutable (an NSMutableDictionary, say), you can change the actual field, and you don't have to replace anything in the array:
NSMutableDictionary *dict = [array objectAtIndex:1];
[dict setObject:@"New Name" forKey:@"Name"];
If the objects in the array are immutable, you'll have to replace the object at the correct index:
NSDictionary *dict = @{@"Id":@2, @"Name":@"New Name"};
[array replaceObejectAtIndex:1 withObject:dict];
You can also do this by creating a mutable copy (but in this case, unlike the first, you have to set it back into the array):
NSMutableDictionary *dict = [[array objectAtIndex:1] mutableCopy];
[dict setObject:@"New Name" forKey:@"Name"];
[array replaceObejectAtIndex:1 withObject:dict];
The Id values in your dictionaries, incidentally, are not what we're using to locate things in your array. As you specified, we're using indexes. If you want to look up values based on those Id records, say so, because the code will be different then.