A cask whose formula declares auto_updates true, meaning the application has its own updater, or version :latest, meaning the download URL has no version in it, is deliberately excluded from 'brew upgrade'. Homebrew has no reliable way to tell whether the installed copy is current, and upgrading would fight the app's own updater.
The result is that 'brew outdated' looks clean while several applications are months behind, and 'brew upgrade' reports nothing to do.
List what is being skipped with 'brew outdated --cask --greedy', and upgrade them with 'brew upgrade --cask --greedy'. Be aware that for a version :latest cask, greedy mode re-downloads and reinstalls every time because there is no version to compare, so it is not something to run on a schedule without thought. The narrower flags '--greedy-latest' and '--greedy-auto-updates' select just one of the two categories. Reinstalling a running application can also require quitting it first; the cask's uninstall stanza may kill the process.