As mentioned in the comments by Barmar, an attempt to put things into the positional argument of time when there are multiple spaces moves it to the reason.
+t @user 3d2h1s30m test
A simple fix could be the way that you run the command itself:

As long as the time duration is without spaces, your regex works perfectly!
+t @Nestling Bot#9410 "3d 2h 1s 30m" test
Like Barmar mentioned, quotes work just fine.
Another way to do this is to have one keyword positional argument that parses until the last segment of hour/minute/second/day:
@bot.command(
name="timeout",
aliases=["mute", "t"],
help=""
)
@has_permissions(moderate_members=True)
async def timeout(ctx, user: discord.Member, *, reasonAndTime="No reason provided"):
print(reasonAndTime)
# this is an odd way to go about things but hey it should work right?
time = ''
reason = ''
for param in reasonAndTime.split(' '):
try:
if param[-1] == 's': # check seconds
time += param
elif param[-1] == 'm': # check seconds
time += param
elif param[-1] == 'h': # check seconds
time += param
elif param[-1] == 'd': # check seconds
time += param
else:
reason += f' {param}'
except TypeError: # Not an int, see https://stackoverflow.com/a/3501408/15982771
reason += f' {param}'