Large No of MySQL running threads killing response times
Query cache off -- good

Large history list -- Innodb stumbling over itself.

Latency suddenly shot up -- ditto

Thread count suddenly shot up -- ditto.

Possible causes:


A long-running UPDATE or ALTER blocking lots of other threads.  Or even a SELECT that was poorly written.  If the slowlog was on, you may be able to discover what it was.  long_query_time = 0.5 implies that (if the slowlog was turned on) it will have caught the naughty query.  And there would be a lot of normally-fast queries in the log, too.
Too many threads.  What is "too many"?  When this happens.  How to control it?  Decrease the limit on number of connections, either in the clients, or with max_connections.  I know that sounds like a bad remedy, but when MySQL gets into the state you described, it may take a restart to uncork it.  Sharing resources among 300-400 threads means that no one will 'ever' get finished.  How many clients?  Web server(s)?  What is the limit on each?  Example: Apache's MaxClients.
Swapping.  Do you have any monitoring that would say that there was swapping? 90G/128G sounds fine, but perhaps something else was eating into RAM.  Swapping is terrible for MySQL.