How to allow in-progress transactions to complete when shutting down PostgreSQL?
I don't know of a way to do this automatically.  You could start a smart shutdown, and then loop through live connections terminating them if they are idle.  This would be a bit fragile, as if your grim reaper script were to lose its connection it could not re-establish it.  A less fragile way would be to edit pg_hba.conf to block all connections except from the grim reaper (instead of starting a smart shutdown), then do the same loop as above.  Once there are no other connections, you can do a regular fast shutdown.

But this might not be necessary because:  


  fast will kill all connections whether active or idle, which seems to set me up to risk corrupting an in-progress transaction


There will be no corruption  It will either commit, or will rollback with an error reported to the client.  The only risk is that a poorly written client might not correctly deal with the error, but if that is the case you probably have bigger problems than just expanding your EBS.