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.00095

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "111.07"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "3.38"
      },
      "nested_loop": [
        {
          "table": {
            "table_name": "cscart_categories",
            "access_type": "ALL",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "rows_examined_per_scan": 126,
            "rows_produced_per_join": 5,
            "filtered": "4.00",
            "cost_info": {
              "read_cost": "29.72",
              "eval_cost": "1.01",
              "prefix_cost": "30.73",
              "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": "5.59",
            "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": "64.86",
              "eval_cost": "0.68",
              "prefix_cost": "107.69",
              "data_read_per_join": "54"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

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