SELECT 
  COUNT(*) 
FROM 
  vi_promotions 
  LEFT JOIN vi_promotion_descriptions ON vi_promotion_descriptions.promotion_id = vi_promotions.promotion_id 
  AND vi_promotion_descriptions.lang_code = 'en' 
  LEFT JOIN vi_storefronts_promotions AS storefronts_promotions ON storefronts_promotions.promotion_id = vi_promotions.promotion_id 
WHERE 
  1 
  AND status IN ('A', 'H') 
  AND vi_promotions.zone = 'catalog' 
  AND (
    storefronts_promotions.storefront_id = 1 
    OR storefronts_promotions.storefront_id IS NULL
  )

Query time 0.00016

JSON explain

{
  "query_block": {
    "select_id": 1,
    "nested_loop": [
      {
        "table": {
          "table_name": "vi_promotions",
          "access_type": "ALL",
          "rows": 14,
          "filtered": 100,
          "attached_condition": "vi_promotions.`status` in ('A','H') and vi_promotions.zone = 'catalog'"
        }
      },
      {
        "block-nl-join": {
          "table": {
            "table_name": "storefronts_promotions",
            "access_type": "index",
            "key": "PRIMARY",
            "key_length": "8",
            "used_key_parts": ["storefront_id", "promotion_id"],
            "rows": 11,
            "filtered": 100,
            "using_index": true
          },
          "buffer_type": "flat",
          "buffer_size": "177",
          "join_type": "BNL",
          "attached_condition": "trigcond(storefronts_promotions.storefront_id = 1 or storefronts_promotions.storefront_id is null) and trigcond(storefronts_promotions.promotion_id = vi_promotions.promotion_id)"
        }
      }
    ]
  }
}

Result

COUNT(*)
4