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 (
    400316, 401024, 401027, 401040, 401070, 
    401577, 401589, 401603, 401614, 401618, 
    401630, 402338, 402355, 402360, 402362, 
    402897, 402908, 402938, 403717, 404218, 
    404252, 404994, 405004, 405006
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00144

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "39.93"
    },
    "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": 72,
            "rows_produced_per_join": 72,
            "filtered": "100.00",
            "using_index": true,
            "cost_info": {
              "read_cost": "7.53",
              "eval_cost": "7.20",
              "prefix_cost": "14.73",
              "data_read_per_join": "1K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (400316,401024,401027,401040,401070,401577,401589,401603,401614,401618,401630,402338,402355,402360,402362,402897,402908,402938,403717,404218,404252,404994,405004,405006))"
          }
        },
        {
          "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": "18.00",
              "eval_cost": "0.36",
              "prefix_cost": "39.93",
              "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
400316 20,17421,3M
401024 20,17421,3M
401027 20,17421,3M
401040 20,17421,3M
401070 20,17421,3M
401577 20,17421,3M
401589 6649,17422,3M
401603 20,17421,3M
401614 20,17421,3M
401618 20,17421,3M
401630 20,17421,3M
402338 20,17421,3M
402355 20,17421,3M
402360 20,17421,3M
402362 20,17421,3M
402897 20,17421,3M
402908 20,17421,3M
402938 20,17421,3M
403717 20,17421,3M
404218 20,17421,3M
404252 20,17421,3M
404994 6649,17422,3M
405004 20,17421,3M
405006 6649,17422,3M