Вы можете составить список действий для каждого ключа, чтобы можно было применять логику проверки на ноль для каждого из них.
let j = JObject.Parse x
let doStuff key value = printfn "%s=>%s" key value
Если вы хотите применить doStuff для каждого ключа, который вы можете выполнить итерацию. Это ваш пример, но без остального, поэтому он делает это для каждого присутствующего ключа.
["aa", doStuff
"bb", doStuff
"cc", doStuff]
|> List.iter (fun (key,action) ->
j.TryGetValue key
|> snd
|> Option.ofObj
|> Option.iter (action key))
Если вы более точно подходите к своему примеру, где вы используете только doStuff для первого присутствующего ключа, вы можете выбрать, чтобы получить только действительные значения,actions.
["aa", doStuff
"bb", doStuff
"cc", doStuff]
|> Seq.choose (fun (key,action) ->
j.TryGetValue key
|> snd
|> Option.ofObj
|> Option.map (fun v -> action key v))
|> Seq.tryHead
Эта версия также возвращает результат примененного doStuff, если был соответствующий ключ и doStuff вернул значение. Это немного злоупотребляет ленивой природой Seq, чтобы вызывать только первое значение, но вы также можете сопоставить функции вызов функции Seq.tryHead.