It's not currently possible to offer an exchange with a fixed time limit. However the offering party can cancel the exchange offer at any time (if it has not yet been accepted) using the disablerawtransaction API. This performs a double-spend against one of the exchange inputs, rendering it unusable.
It is possible to specify that the exchange is performed with a particular party, if you go via the raw transaction route. You would use createrawtransaction to create a transaction that spends the output created by preparelockunspent, and add two outputs – one going to the other party with the offered assets, and one going back to you with the desired assets. Then sign this transaction with ALL|ANYONECANPAY in the last parameter of signrawtransaction, which locks the outputs but allows another input to be added.
This transaction is then passed to the other side, and they would verify its contents using decoderawtransaction, add their input only using appendrawtransaction (containing the assets asked for), then sign the whole thing with signrawtransaction and broadcast it using sendrawtransaction.