First, $and is redundant because there is an implicit and in the query.
Second, $eq is also redundant because FieldName : Value implicitly mean equality.
I would try with simply
db.collection.find( { "data.0.val1" : "xyz" , "data.0.val2" : "abc" } )
or (which I find easier to read)
db.collection.find( { "data.0" : { "val1" : "xyz" , "val2" : "abc" } )