Hey Lasya
Why doesn’t the first approach (calling the data source microflow directly) refresh the grid?
Because you did only call the microflow you didn't execute the datasource microflow in that grid. If you want the data to be refreshed in the grid, the grid must execute the microflow, not the user separately.
Is creating a non-persistent object and refreshing it in client (without committing) a reliable and recommended way to trigger a data grid refresh?
Yes, this is one way to do it. Another one would be to use a java action called Refresh Entity from NanoflowCommons module. This would refresh all objects which belong to your entity in that page you're currently at.
You can achieve that with a button which triggers a microflow which then refreshes your specific entity by an object parameter (you can retrieve a single object and use the refresh activity)
Are there best practices for refreshing microflow-based grids when using external databases and non-persistent entities?
I mentioned one new at the previous point. But your idea does it good as well!