a) looping through records on a layout in order to find records is very slow and not necessary, Perform a find, use an ExecuteSQL query or match records via a relationship to find the records you need to use for your email notifications.
b) This may very well still need to be done on a layout based on that table. But it need not be on the same layout that users interact with nor need it be based on the same table occurrence. (two layouts based on different occurrences of the same table will have found sets that are independent of one another) You can also open a different window in order to pull up a found set of these records.
c) to avoid record locking issues with users that might be editing the same record, "mark" a record has having been used to send an email by setting a value in a record from a related table.