SELECT 
  cscart_products_categories.product_id, 
  GROUP_CONCAT(
    IF(
      cscart_products_categories.link_type = "M", 
      CONCAT(
        cscart_products_categories.category_id, 
        "M"
      ), 
      cscart_products_categories.category_id
    )
  ) AS category_ids 
FROM 
  cscart_products_categories 
  INNER JOIN cscart_categories ON cscart_categories.category_id = cscart_products_categories.category_id 
  AND cscart_categories.storefront_id IN (0, 1) 
  AND (
    cscart_categories.usergroup_ids = '' 
    OR FIND_IN_SET(
      0, cscart_categories.usergroup_ids
    ) 
    OR FIND_IN_SET(
      1, cscart_categories.usergroup_ids
    )
  ) 
  AND cscart_categories.status IN ('A', 'H') 
WHERE 
  cscart_products_categories.product_id IN (
    638, 639, 980, 981, 982, 983, 984, 990, 
    991, 997, 998, 999, 1000, 1001, 1002, 
    1003, 1004, 1005, 1006, 1007, 1008, 
    1009, 1010, 1011, 1016, 1017
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00129

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "107.84"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "3.70"
      },
      "nested_loop": [
        {
          "table": {
            "table_name": "cscart_categories",
            "access_type": "ALL",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "rows_examined_per_scan": 125,
            "rows_produced_per_join": 5,
            "filtered": "4.00",
            "cost_info": {
              "read_cost": "29.49",
              "eval_cost": "1.00",
              "prefix_cost": "30.49",
              "data_read_per_join": "20K"
            },
            "used_columns": [
              "category_id",
              "storefront_id",
              "usergroup_ids",
              "status"
            ],
            "attached_condition": "((`cscart`.`cscart_categories`.`storefront_id` in (0,1)) and ((`cscart`.`cscart_categories`.`usergroup_ids` = '') or find_in_set(0,`cscart`.`cscart_categories`.`usergroup_ids`) or find_in_set(1,`cscart`.`cscart_categories`.`usergroup_ids`)) and (`cscart`.`cscart_categories`.`status` in ('A','H')))"
          }
        },
        {
          "table": {
            "table_name": "cscart_products_categories",
            "access_type": "ref",
            "possible_keys": [
              "PRIMARY",
              "pt"
            ],
            "key": "PRIMARY",
            "used_key_parts": [
              "category_id"
            ],
            "key_length": "3",
            "ref": [
              "cscart.cscart_categories.category_id"
            ],
            "rows_examined_per_scan": 12,
            "rows_produced_per_join": 3,
            "filtered": "6.16",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (638,639,980,981,982,983,984,990,991,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1016,1017))",
            "cost_info": {
              "read_cost": "61.65",
              "eval_cost": "0.74",
              "prefix_cost": "104.14",
              "data_read_per_join": "59"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
638 365,363,309M
639 365,363,309M
980 309,363,364M
981 364M,309,363
982 364M,309,363
983 364M,309,363
984 363,364M,309
990 363,364M,309
991 309,363,364M
997 309,365M,363
998 309,365M,363
999 309,365M,363
1000 363,309,365M
1001 363,309,365M
1002 309,365M,363
1003 309,365M,363
1004 309,365M,363
1005 309,365M,363
1006 363,309,365M
1007 363,309,365M
1008 365M,363,309
1009 309,365M,363
1010 309,365M,363
1011 309,365M,363
1016 345,309,357M
1017 357M,345,309