Concurrent update queries locking rows when `where` clause doesn't match
A lesson to learn about indexing.  INDEX(a,b,c) is not optimal for WHERE a=1 AND c=2.  This is because only the leftmost column(s) of an index will be used; there cannot be any skipping over columns (b, in this example).

Back to your question.

INDEX(slack_channel_id, message_id)


is needed, and

INDEX(`slack_id`,`slack_channel_id `,`message_id`)


is not useful at all.  slack_id is in the way.

KEY `slack_message_message_id_foreign` (`message_id`),


will be partially useful -- namely for narrowing the search down to those rows with the desired message_id.

A Cookbook on building optimal indexes.