Your trouble comes from your first while true do loop. Because it is an infinite loop, your script isn't executing any of the code after it. It is generally good practice to do any one-time setup in the script first, then put an infinite loop at the end to make sure the rest of the code runs first.
In your case, there are two options: make the first loop a coroutine, or put all the code in the loops into one master loop. I took the latter option in the second code block.
I explained with comments what wasn't working with your script in the first code block, then provide a more straightforward way in the second code block.
local time_zone = -5
while true do
wait (60*60)
sound:Play()
end
local secondsInDay = 60*60*24
while true do
local tick = math.fmod(tick(),secondsInDay)
local hour = math.floor(tick/3600) + 5 + time_zone
local minute = math.floor(tick/60 - 60*hour)
local second = math.floor(math.fmod(tick,60))
wait(1)
end
Now the second block.
while wait(.2) do
if math.fmod(tick(), 3600) == 0 then
print'sound'
end
local ticker = tick()
local hour = math.floor(math.fmod(ticker/3600, 24))
local minute = math.floor(math.fmod(ticker/60, 60))
local second = math.floor(math.fmod(ticker,60))
print(hour, ':', minute, ':', second)
end