ODBC is not as bad as people think. I have used Access query on million records table with acceptable (if not blazing) performance. However it is important to write the query in such a way that ODBC will be able to analyze it and have SQL do most of the work.
Queries doing SUM(), Coun() usually run fast. Query with many joins and pulling lots of rows will evidently be slower. SQL is quite capable of pulling 100,000 rows in a short time but it?s your Access front-end that will have a hard time receiving all this data and posting it on a datasheet or multirow form. Another killer is when you use a VB function within the query. If ODBC is not able to optimize the query it will attempt to have SQL do as much of the work as possible and then pass all the received rows to Access for futher processing. If you pass a field value to a VB function then it will mostly be quite slow if ODBC get?s back 1 million rows.
If users are good enough with pure SQL then go with Pass-Through queries (much faster).
On the other hand, nothing prevents the user from opening the attached table and do CTRL-End to go at the end of the data (Causing Access to pump-down 2 million records, not a good thing to do).
To prevent long running queries make sure the server is configured to use the query governor and set value at 300 or 600 seconds. SQL will kill any queries exceeding this value.