WCF using TAP without worrying about timeouts
Design Trigger

I don't understand why you implement a duplex wcf operation to emulate a simplex operation, just to avoid configuring the timeout. Let's assume you have a really good reason why you don't want to change the default timeouts, then your solution can still time out on being idle (after 10 minutes), because you changed from timing out on SendTimeout to ReceiveTimeout. 

As explained here the following timeouts have an impact on your code:


SendTimeout:
maximum threshold to expire an ongoing simplex operation. -> The timeout you don't like to configure (default: 1 minute)
ReceiveTimeout: 
maximum idle time on a session. -> The timeout between the one-way message and the callback fired back. (default: 10 minutes)




Review


Your concern about using a single instance for multiple calls is valid. Using a single instance with a single callback is the simplest solution. Otherwise, you would need to implement a matching system with correlation ids in the request and callback contracts.
The lifetime management is not robust enough. Use a try-finally block to close the connection. Also, distinguish between Abort (when connection is Faulted) and Close (graceful disconnect) (Close Connection).


//wait for the result
var result = await tcs.Task;  // &lt;- if this throws an exception

//close the connection
client.Close();       // &lt;- this won't be called