MSAL.NET does not expose refresh tokens, for security reasons: MSAL handles refreshing tokens for you with token cache.
MSAL maintains a token cache and caches a token after it has been acquired. It's also capable of refreshing a token when it's getting close to expiration (as the token cache also contains a refresh token).
You can improve the availability of your application by regularly using WithForceRefresh which will internally acquire new access token when set to true
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.WithForceRefresh(true)
.ExecuteAsync();