SELECT 
  products_categories.product_id, 
  GROUP_CONCAT(
    IF(
      products_categories.link_type = "M", 
      CONCAT(
        products_categories.category_id, 
        "M"
      ), 
      products_categories.category_id
    )
  ) AS category_ids 
FROM 
  products_categories 
  INNER JOIN categories ON categories.category_id = products_categories.category_id 
  AND categories.storefront_id IN (0, 1) 
  AND (
    categories.usergroup_ids = '' 
    OR FIND_IN_SET(0, categories.usergroup_ids) 
    OR FIND_IN_SET(1, categories.usergroup_ids)
  ) 
  AND categories.status IN ('A', 'H') 
WHERE 
  products_categories.product_id IN (
    253997, 263740, 261960, 263454, 255355, 
    257117, 253991, 263431, 254003, 253996, 
    268001, 253999, 268000, 255360, 263451, 
    263452, 262071, 257118, 262069, 262067, 
    263455, 260871, 263450, 263737
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00130

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "42.11"
    },
    "grouping_operation": {
      "using_filesort": false,
      "nested_loop": [
        {
          "table": {
            "table_name": "products_categories",
            "access_type": "range",
            "possible_keys": [
              "PRIMARY",
              "link_type",
              "pt"
            ],
            "key": "pt",
            "used_key_parts": [
              "product_id"
            ],
            "key_length": "3",
            "rows_examined_per_scan": 76,
            "rows_produced_per_join": 76,
            "filtered": "100.00",
            "using_index": true,
            "cost_info": {
              "read_cost": "7.91",
              "eval_cost": "7.60",
              "prefix_cost": "15.51",
              "data_read_per_join": "1K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (253997,263740,261960,263454,255355,257117,253991,263431,254003,253996,268001,253999,268000,255360,263451,263452,262071,257118,262069,262067,263455,260871,263450,263737))"
          }
        },
        {
          "table": {
            "table_name": "categories",
            "access_type": "eq_ref",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "key": "PRIMARY",
            "used_key_parts": [
              "category_id"
            ],
            "key_length": "3",
            "ref": [
              "goimagine.products_categories.category_id"
            ],
            "rows_examined_per_scan": 1,
            "rows_produced_per_join": 3,
            "filtered": "5.00",
            "cost_info": {
              "read_cost": "19.00",
              "eval_cost": "0.38",
              "prefix_cost": "42.11",
              "data_read_per_join": "9K"
            },
            "used_columns": [
              "category_id",
              "usergroup_ids",
              "status",
              "storefront_id"
            ],
            "attached_condition": "((`goimagine`.`categories`.`storefront_id` in (0,1)) and ((`goimagine`.`categories`.`usergroup_ids` = '') or (0 <> find_in_set(0,`goimagine`.`categories`.`usergroup_ids`)) or (0 <> find_in_set(1,`goimagine`.`categories`.`usergroup_ids`))) and (`goimagine`.`categories`.`status` in ('A','H')))"
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
253991 18154,18161,262M
253996 18154,18162,262M
253997 18154,18163,262M
253999 18154,18162,262M
254003 18154,18164,262M
255355 54,18340,295M
255360 54,18340,295M
257117 2,18155,18158,15M
257118 2,18155,18158,15M
260871 54,18340,295M
261960 15,2M
262067 2,18155,18158,15M
262069 2,18155,18158,15M
262071 2,18155,18158,15M
263431 317,18340,295M
263450 15,2M
263451 2,18155,18158,15M
263452 2,18155,18158,15M
263454 85,18159,387M
263455 15,2M
263737 85,18159,387M
263740 85,18159,387M
268000 271,19644,261M
268001 271,19644,261M