We had the same problem and I used a table-valued function to limit the data being transferred. In this way, the join was on the function and with a smaller results set being transferred over the network. The speed increase was huge in my case.
Ex. (from my bad memory)
Select ...
From vwLocalTable l
Inner Join fnGetRemoteData(l.filterVal) r
on l.key = r.key
where l.filtercol = "something"
We put this whole thing in a view to help to abstract the hole problem with linked server specs in sql.
Hope this helps.