How do I get images (with a thumbnail preview) to show in search results?

This is something that will need to be handled in the search results template of your theme. If the theme is off the shelf then it likely won’t support thumbnail images for attachments because — as you have experienced — attachments do not normally appear in search results.

This is because in a normal theme each result will use the the_post_thumbnail() function to display the thumbnail. Under the hood the featured image itself is an attachment-type post. This function gets the ID of the post’s featured image and uses that ID in wp_get_attachment_image(), which outputs the image/thumbnail for an attachment.

Since attachment posts don’t have a featured image, since they are already attachments themselves, this function won’t display anything.

Therefore to display the image for an attachment post the template would need to check if the post is an attachment, and if so skip the_post_thumbnail() and go directly to wp_get_attachment_image() with the post’s own ID. You can see from this example that this is how the attachment template displays the image.

In practice this would look something like:

if ( get_post_type() === 'attachment' ) {
    echo wp_get_attachment_image( get_the_ID(), 'large' );
} else {
    the_post_thumbnail( 'large' );
}

The exact image size to use in place of 'large' depends on what your theme already uses.

This would involve modifying your theme files, and the exact file depends on the original theme. You will need to check your theme files against the Template Hierarchy to see which files are actually being used. Whichever file it is, you should make your changes by creating a Child Theme. This will ensure the change is safe from updates to your theme, which would normally erase any changes.

Another method that won’t involve modifying templates (but will still require you create a child theme or custom plugin to put the code in) would be to filter the request for the post thumbnail ID.

Deep down the_post_thumbnail() uses get_post_meta( $post->ID, '_thumbnail_id', true ); to get the ID of the attachment that is the featured image for the post. You could filter this so that if WordPress is requesting that meta value for a post, and the post is an attachment, return the attachment’s ID instead.

You can do this with the get_post_metadata filter:

function wpse_300128_attachment_post_thumbnail( $value, $post_id, $meta_key, $single ) {
    if ( get_post_type( $post_id ) === 'attachment' && $meta_key === '_thumbnail_id' ) {
        return $single ? $post_id : array( $post_id );
    }
}
add_filter( 'get_post_metadata', 'wpse_300128_attachment_post_thumbnail', 10, 4 );

With that filter active, any time WordPress tries to get the thumbnail ID of an attachment post, it will receive the ID instead. The return value is either just the ID or an array containing the ID based on the value of $single. This is so that the result will be the expected format regardless of whether the original call has $single set to true or false.