SQL Server varbinary column modifying inserted data
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 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.