###The problem lies in the fact that you wrongly assume that the pos variable is a reference to the actual property of the Handle. If the position of the Handle changes, the variables you have defined won't update; only its Position property will change. In order to fix this, you can remove the pos variable and only make direct accesses to the Position property of the Handle. You could also modify the variables to hold the Handle object itself, which you have already done, so simply directly access the property.
local click = script.Parent
local part = click.Parent
click.MouseClick:Connect(function()
game.ServerStorage.Handle:Clone().Parent=workspace
end)
local handle = workspace:WaitForChild("Handle")
handle.CFrame = CFrame.new(handle.Position)
#Reference vs Value
###It is important to note the difference between a reference and a value. You can think of a reference as holding an actual memory location whilst a value just holds normal information (for example, a boolean).
##Reference
###In Lua, for example, dictionaries are passed by reference.
local t1 = {
foo = "abc",
bar = 123,
foobar = true
}
local t2 = {
foo = "abc",
bar = 123,
foobar = true
}
local t1reference = t1
t1.foo = "Hello world!"
print(t1.foo)
print(t1reference.foo)
print(t2.foo)
###The t1 and t1reference variables both hold the same exact dictionary, whilst t2 is a different dictionary despite it holds the same values.
##Value
###However, data like booleans and numbers are passed via value.
local number = 50
local numberVal = num
number = 25
print(number)
print(numberValue)
local bool1 = false
local bool1Val = bool1
bool1 = true
print(bool1)
print(bool1Val)
###Even though numberValue was set to number, both variables have different memory and so changing one value does not change the other value. Same for the boolean values, bool1Val never changed even after updating bool1.