Is there any way to make a transaction invalid if it is not confirmed before a certain block? It seems like it would be useful to avoid replay attacks if your wallet could specify that a transaction must be confirmed before say the (current+100)th block before broadcasting it

I guess there could be a problem with this scheme if the tx was no longer able to be included into a block after a reorg (esp for dependent txs)
No, there isn't a way to make a transaction that has to be included before a certain block number. 

And there's a good reason for this: such a transaction would not be what is known as reorg-safe. Generally, transactions should be able to be included in either side of a block chain fork. If you make a transaction that can only be included before a certain block number, and then a fork occurs that makes a chain that doesn't include it before the designated block number, then that transaction gets reversed and so do all transactions that depend on the base transaction.