It's important to understand why you don't want to cache block. If this is meant to show some session specific information then you should be looking into
One non-recommended option could be also custom controller what returns some data over ajax-call (with POST-method so it wouldn't be cached).
(!) cacheable="false" must not be used. Here will follow, WHY not:
A block with cacheable="false" will make the whole page uncached. It is not used for cache hole-punching. Also older M2 docs page use to says this (To create an uncacheable page, mark any block on that page as uncacheable in the layout using cacheable="false").
New docs is saying
What it does is that Varnish/Fastly modules will be sending due this attribute value always non-cacheable headers.
When we enable cachable="false" and while using Varnish/Fastly then browser side following headers are sent :
X-Magento-Cache-Debug:MISS
X-Magento-Cache-Control:max-age=0, must-revalidate, no-cache, no-store
Age: 0
For that can be debugged the Magento's page caching code on
vendor/magento/module-page-cache/Model/Layout/LayoutPlugin.php::afterGenerateXml
vendor/magento/module-page-cache/Model/Layout/LayoutPlugin.php::afterGetOutput
where first one should send public Cache-Control with TTL and second should send X-Magento-Tags for Varnish/Fastly.
Both are using isCacheable() check where this always returns FALSE due following check (check if in current layout there are any attributes:cacheable="false"):
$cacheableXml = !(bool)count($this->getXml()->xpath('//' . Element::TYPE_BLOCK . '[@cacheable="false"]'));
When we remove cacheable="false" then we start to get isCacheable() checks as TRUE and also get headers correctly on start-/category-/productpages.
X-Magento-Cache-Control:max-age=86400, public, s-maxage=86400
X-Magento-Cache-Debug:HIT
X-Magento-Cache-Hits:1
Age:32