Why delete with "where in" condition is slow, while looping & using single where is fast?
When building an index, start with the things that are tested with =.  That is, the index should be
 INDEX(node_id, is_successful,   -- in either order
       monitor_id)               -- last

Another tip:  When you have both INDEX(a) and INDEX(a,b), the former is unnecessary since the latter can handle searching just by a.  (But not just b.)  That is, currently your single-column index (monitor_id) can be DROPped.
More on building indexes:  http://mysql.rjweb.org/doc.php/index_cookbook_mysql