The data you pasted is exactly 65533 hex characters. Including the "0x" prefix, this is 65535 which is exactly 2^16 - 1. This strongly hints that the code that generates the hexadecimal string representation of the binary data is limited to 65535 characters. Very likely, it is using a buffer of that length.
If you are using SQL Server Management Studio to retrieve a varbinary value to use in your update query, please note that the value will be truncated according to this SSMS setting:
Tools / Options / Query Results / Results to Grid / Max Characters Retrieved / Non XML Data
This setting happens to have a maximum value of 65535. If you set this max value to, say, 31, you would get the same odd-numbered string from your example:
select * from photo -- 0xFFD8FFE000104A46494600010101 -- 29-digit hex string
This StackOverflow answerThis StackOverflow answer explains that the when there is an odd number of hex characters, SQL server will assume there is a leading 0. So if you write this:
update Photo set photo_data = 0xF -- a 1-digit hex string
It is functionally equivalent to writing this:
update Photo set photo_data = 0x0F
And in fact selecting it out of the table will show you it is 0x0F.