MD5.pm doesn't bypass anything. If it would, you'd get the same result for all three outputs.
Here is, in more detail, what happens:
You open a file, and apply the crlf IO layer.
You write a "\n" to that file. The crlf layer converts that to CRLF
MD5.pm reads from the very same filehandle. That means that the CRLF is converted to "\n" again upon reading. MD5.pm interprets that as binary data, and thus as LF.
You close the file, and open it again, this time without any layer
MD5.pm reads from that file, and this time the line ending comes out as CRLF, because no IO layer converts anyting. MD5.pm computes a hash, which is different than before because the source data is different