the_content() behavior on attachment.php versus single.php
This is correct behavior, if your attachment doesn’t actually have anything in post_content field (which is quite common). When post–centric templates run, prepend_attachment() is used as filter to “emulate” post content. This is not the case with template “intended” for attachments. If you look at template-loader.php: elseif ( is_attachment() && $template = get_attachment_template() ) : …