I think you should be able to use the
Utilities.sleep() function to pause the script. So where it is doing the looping and sending, just inject the sleep() somewhere in the loop, maybe even at the beginning:
// loop through all the rows of data
obj.forEach(function(row, rowIdx){
Utilities.sleep(60000); //pause for 1 minute; maximum pause is 5 minutes (300000 mil-sec)
// only send emails is email_sent cell is blank and not hidden by filter
if (row[EMAIL_SENT_COL] == ''){