TL;DR: I may not be following, but I think it is the opposite. Holding the file open doesn't prevent syslog-ng from writing the messages; it speeds it up.
When syslog-ng writes to a file, it held the file open by default for 60 seconds after the write. If another message comes along in that time, it writes it to the file a little faster, then restarts the clock. After 60 seconds it closed the file. Every hour, along comes skynet which wants to do its in-place sed. Sed reads the log file, does its processing of it to a temporary file, and then renames the temporary file as the original name. If syslog-ng has the file open at that moment, it can't, and whatever changes skynet wanted to make are lost until the next hour, which then will also include the messages syslog-ng was writing at the moment skynet wanted to rename the file. If skynet was in the process of renaming the file, and syslog-ng wanted to write, then the message would be held in the syslog-ng buffer until skynet closed the file. This would be the same if syslogd was running and we were dealing with /tmp/syslog.log. A downside of skynet's doing its sed on the primary log file, but reduced likelihood of a collision since syslog-ng is only writing skynet messages to that file.
When syslog-ng came along with its changes, it allowed that 60 seconds (or whatever the global time-reap was set to) to be changed on a per log file basis. But it also overrode the global 60 seconds in our case, because it was thought nobody would be writing to a file without a template, so syslog-ng left the file open forever. That meant skynet could never complete its sed. For reasons I don't understand, the result was new syslog-0.log file, with nothing written, while syslog-ng continued on its way writing to the original file, lost in space. Explicitly invoking time-reap(60) restores the original behavior, but in our application I don't think we are writing that much, so closing the file after 2 seconds makes the possibility that much less.