Why don't {{ product.body }} and {{ product.field_specifications }} return values in custom commerce-product.html.twig file I am using Commerce 2.0 on Drupal 8.4.

I have sub-themed Bartik and placed a commerce-product.html.twig file in the sub-theme's /templates folder to experiment with theming a Commerce2 product page.

My product-type has a custom field called 'specifications'.
The Manage-display for the product-type places both 'body' and 'specifications' in the Content portion (not disabled).

An example product of this product type was given the following values.  

title = "Product 1 title"  
body = "Product 1 body"      
specifications = "Product 1 specifications"


The product-display page for Product 1 displays the following for the corresponding twig commands:

{{ product.title }} displays "Product 1 title"  
{{ product.body }} displays nothing    
{{ product.field_specifications }} displays nothing  

{{ product_entity.title.value }} displays "Product 1 title"  
{{ product_entity.body.value }} displays "&lt;p&gt;Product 1 body&lt;/p&gt;"   
{{ product_entity.field_specifications.value }} displays "&lt;p&gt;Product 1 specifications&lt;/p&gt;"   


Seeing that  

{{ product.title }} and {{ product_entity.title.value }} agree.


why does 

{{ product.body }} display nothing while {{ product_entity.body.value }} displays something.


and

{{ product.field_specifications }} display nothing while {{ product_entity.field_specifications.value }} displays something.


(An informative discussion of the field variables available in commerce-product.html.twig is here)
why does
{{ product.body }} display nothing while {{ product_entity.body.value
}} displays something.

This is because {{ product.body }} returns an array not a single value. Body has other properties such as summary so you need to specify what you want from that field.

why does
{{ product.field_specifications }} display nothing while {{
product_entity.field_specifications.value }} displays something.

I'm not sure what field type you set field_specifications to, but I'm guessing you set it to a formatted text field. If that's the case it would return an array just like Body would. If field_specifications was simply a textfield, {{product.field_specifications}} would have worked.