How about:
changeOrCreate :: String -> (Int -> Int) -> [SomeRec] -> [SomeRec]
changeOrCreate nameToSearch valModifier =
pos . val %~ valModifier
& outside (filtered (not . has pos)) %~ (. newRec)
where
pos :: Traversal' [SomeRec] SomeRec
pos = taking 1 (traversed . filtered (anyOf name (== nameToSearch)))
newRec = (SomeRec nameToSearch 0 :)