Сложить допустимые значения второго инпута в массив:
const values = [ 2, 3, 5, 7, 11, 13, 17, 19, ... ];
Сделать эффект, зависящий от обоих значений, где второе будет исправляться. Берёте ту половину допустимых значений второго инпута, которая соответствует текущему значению первого инпута, ищите в ней ближайшее к текущему второму:
useEffect(() => {
const index = values.indexOf(граничное_значение_второго_инпута);
setVal2(values
.slice(...(val1 > граничное_значение_первого_инпута ? [ index ] : [ 0, index ]))
.reduce((val, n) => Math.abs(val - val2) < Math.abs(n - val2) ? val : n)
);
}, [ val1, val2 ]);
https://jsfiddle.net/recx8j6w/