I do something similar, but with redbrick, not sql server. These are my observations:
Using a pass through query there is little if any difference in performance. However, the output will be read only which may or may not be what you want.
Using the access query designer, on a single table, with a composite primary key, it might be lightning fast or horrendously slow. If the query is not going to return any rows, you instantly get an empty result set. However, if the query is going to return data, it's different story.
This example uses a table called clinic_fact with a primary key of registration_number and clinic_position. It has about 6.5 million records. If you query the database directly, filtering on a single registration_number, you get instant results. In access, it takes over 10 seconds to get the results. During that time I get to see what sql is being generated. It looks like this.
select yourfields
from "clinic_fact"
where "registration_number" = 'something' and "clinic_position" = 2
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1
or "registration_number" = 'something' and "clinic_position" = 1;
This query returns 2 rows. The clinic positions are 1 and 2.
Stuff like this may or may not happen with SQL Server. I suggest that you try it and see.