One aspect of remote queries you can't affect is the data being moved between the two systems. If you move one million rows (just plucking a number out of the air) it takes longer than moving one row. There's no tuning possible on the calling machine that changes this.
So, what can you do? Well, treat the other machine and the other query as if it were a query on your system. Ensure that you're passing filter criteria so it retrieves a smaller data set. Ensure that there are indexes in place on the remote machine that you're able to use when filtering that data. Don't use constructs in the query that prevent index/statistics use. In short, all the standard query tuning mechanisms that you employ locally have to be done on the remote end.
After that, it's just a question of bandwidth. And yeah, I hear it constantly, but we can't filter that data until we get it back. Oh well, you're stuck. I'd push back on that concept. Filter as much as humanly possible on the remote query, however you have to do it.