How to refactor the boolean logic of this F# function?
I would avoid using Option .IsNone and .Value, mainly because .Value will throw an exception if you made a mistake and called it at the wrong time. Almost all F# code will avoid that property and use pattern matching instead or some other function.
Here's another way to write the patternPredicate function, which I renamed to includePath do describe what it actually does:
let includePath (includePattern: string option) (excludePattern: string option) path =
    let isIncluded =
        match includePattern with
        | Some includePattern -&gt; matchWildcard includePattern path
        | None -&gt; true
    let isExcluded =
        lazy
            match excludePattern with
            | Some excludePattern -&gt; matchWildcard excludePattern path
            | None -&gt; false
    isIncluded &amp;&amp; not isExcluded.Value

My approach here was to first build up the values isIncluded and isExcluded so that we can write isIncluded &amp;&amp; not isExcluded.Value. This breaks the problem down into understandable and explicit parts.
Note the use of a lazy value for isExcluded. This means that it won't be evaluated unless isIncluded is true, so we don't need to call matchWildcard unnecessarily.