@Micron,
dlookups() run queries so when you run them inside another query, you run a separate query for every row of the original query. If the outer query returns a thousand rows, you run 1001 queries. The original plus the lookup query for each row.
In almost all cases dlookups() can be replaced with outer joins. Using a Left Join caters for the situation where the lookup value might be null. If you were to use an Inner Join, only rows with matches in BOTH tables would be returned.
Running dlookup()s in a code loop seems to be even worse. I ran into this very early on in my Access career. I came from a COBOL environment so I already knew how to code and so I created a procedure exactly like I would have built in COBOL to handle a two file match. My main table had 190,000 rows. The procedure took 1.5 hours to run. The loop included two lookups for each row. So as part of the process of trying to figure out what was so wrong with the code, I commented out the 2 lookups and the procedure took 8 minutes. The lightbulb went on and and I changed the procedure to use a query with two left joins and that reduced the time to around 9 minutes. It was a pretty dramatic improvement. I have the whole thing more thought and decided that I could actually do the whole thing in an update query and the final result was 3 minutes.
So, the bottom line is don't use dlookup()s inside ANY loop (query or code) unless there is no other alternative and don't use a code loop when an action query will do the job.