у вас в Pjax форма перегружается целиком, т.е. берется html с сайта и заменяется, а во вновь пришедшей они не отмечены. Можно как то так сделать грубо говоря:
<?php foreach ($categories as $category): ?>
<div class="filter-options_item">
<label for="category_<?= $category['id'] ?>" class="status_chk">
<input id="category_<?= $category['id'] ?>" type="checkbox" name="ProductSearch[category_id][<?= $category['id'] ?>]" value="<?= $category['id'] ?>" <?=isset(Yii::$app->request->post('ProductSearch'),Yii::$app->request->post('ProductSearch')['category_id'][$category['id']]) ? " checked='checked'" : "" ?> > <span class="label-text"><?= $category['title'] ?></span>
</label>
</div>
<?php endforeach; ?>
т.е. проверять если ли в посте выбранная категория и ставить чекед.
или можно перенести
<?php Pjax::begin([
'id' => 'productList',
'enablePushState' => false,
'enableReplaceState' => false,
]); ?>
за форму, чтобы форма не входила в нее