Answer to your first question, it is possible. Local variables are not deleted right away, a method to get around it is to declare the function with the variables inline and simply use them from there. It, I believe, reserves the location in memory allocating it only once and will be garbage collected eventually without creating excessive copies.
Answer to your second question, yes as that is best practice. But it would also help if globals are scoped properly as it can cause some minor issues that slowly stack. This has resulted in both Blizzard developers, and addon authors, creating stack overflows.
Lua Code:
local LE_FOLLOWER_TYPE_GARRISON_7_0 = LE_FOLLOWER_TYPE_GARRISON_7_0
local GetAvailableMissions = C_Garrison.GetAvailableMissions
local GetInProgressMissions = C_Garrison.GetInProgressMissions
local GetCompleteMissions = C_Garrison.GetCompleteMissions
function dataobj.OnTooltipShow(tooltip, mis_avl, mis_pro, mis_fin)
-- [ blabla ]
mis_avl = #GetAvailableMissions(LE_FOLLOWER_TYPE_GARRISON_7_0)
mis_pro = #GetInProgressMissions(LE_FOLLOWER_TYPE_GARRISON_7_0)
mis_fin = #GetCompleteMissions(LE_FOLLOWER_TYPE_GARRISON_7_0)
-- [ blabla ]
end