Мое эмпирическое правило, охватывающее в основном 99% всех вариантов использования условных операторов, является:
()
. or [...]
!
< , >= , === , !=, ...
&&
||
MDN дает исчерпывающий пробой: Javascript Operator Приоритет
, поэтому для вашего примера:
(firstRun == true || selectedCategory != undefined && selectedState != undefined)
равно
(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))
Для чего-либо более сложного, чем вышеупомянутые случаи, я бы посмотрел в рефакторинг кода для удобочитаемости в любом случае!